Android的布局与滚动 [英] Android Layout with Scroll
本文介绍了Android的布局与滚动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何创建Android的UI这样
01和02的布局的高度应在色器件的高度的1/3。默认情况下,布局应该显示黑色的区域,那些向下滚动它应该显示01和黑布局的2/3。
- 如果主视图中显示的 01,黑布局的2/3 和用户的向上滚动,然后就应该转到主要布局(黑色布局)
解决方案
我终于找到了解决办法。
进口android.os.Bundle;
进口android.app.Activity;
进口android.util.DisplayMetrics;
进口android.util.Log;
进口android.view.GestureDetector;
进口android.view.GestureDetector.SimpleOnGestureListener;
进口android.view.MotionEvent;
进口android.widget.LinearLayout;
进口android.widget.ScrollView;
进口android.widget.Toast;公共类ScrollLayoutActivity延伸活动{私有静态字符串标记= ScrollLayoutActivity.class.getSimpleName();私人的LinearLayout mTopLayout;
私人的LinearLayout mMiddleLayout;
私人的LinearLayout mBottomLayout;私人滚动型mScrollView;私人布尔possitionTop;
私人布尔possitionMiddle = TRUE;INT mLayoutHeight;
浮mDeviceHeight;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_scroll_layouts); DisplayMetrics displayMetrics =新DisplayMetrics();
。getWindowManager()getDefaultDisplay()getMetrics(displayMetrics)。 //最后的浮动高度= displayMetrics.heightPixels / displayMetrics.xdpi; 以像素为单位//设备高度
mDeviceHeight = displayMetrics.heightPixels;
mLayoutHeight =(INT)mDeviceHeight / 3; mScrollView =(滚动型)findViewById(R.id.scrv); mTopLayout =(的LinearLayout)findViewById(R.id.top);
mMiddleLayout =(的LinearLayout)findViewById(R.id.middle);
mBottomLayout =(的LinearLayout)findViewById(R.id.bottom); mTopLayout.setLayoutParams(新LinearLayout.LayoutParams(mTopLayout
。.getLayoutParams()宽度,mLayoutHeight));
mBottomLayout.setLayoutParams(新LinearLayout.LayoutParams(
。mBottomLayout.getLayoutParams()宽度,mLayoutHeight));
mMiddleLayout.setLayoutParams(新LinearLayout.LayoutParams(
。mMiddleLayout.getLayoutParams()的宽度,(int)的mDeviceHeight)); mScrollView.setHorizontalFadingEdgeEnabled(假);
mScrollView.setVerticalFadingEdgeEnabled(假);
mScrollView.post(新的Runnable(){
公共无效的run(){
mScrollView.scrollTo(0,mLayoutHeight);
}
}); // findViewById(R.id.button).setOnClickListener(新
// View.OnClickListener(){
//
// @覆盖
//公共无效的onClick(视图v){
// Toast.makeText(ScrollLayoutActivity.this,高度:+
// mDeviceHeight,Toast.LENGTH_SHORT).show();
//}
//}); Toast.makeText(这一点,设备高度:+ mDeviceHeight,
Toast.LENGTH_SHORT).show();}公共布尔dispatchTouchEvent(MotionEvent EV){
返回mGestureDetector.onTouchEvent(EV);
}SimpleOnGestureListener simpleOnGestureListener =新SimpleOnGestureListener(){
@覆盖
公共布尔onFling(MotionEvent E1,E2 MotionEvent,浮velocityX,
浮动velocityY){
串滑动=;
浮sensitvity = 100; 如果((e1.getX() - e2.getX())> sensitvity){
刷卡+ =向左滑动\\ N的;
}否则如果((e2.getX() - e1.getX())> sensitvity){
刷卡+ =向右滑动,即可\\ n;
}其他{
刷卡+ =\\ n;
} 如果((e1.getY() - e2.getY())> sensitvity){
刷卡+ =向上滑动即可\\ n;
如果(possitionMiddle&安培;!&安培; possitionTop){
mScrollView.scrollBy(0,mLayoutHeight);
possitionTop = FALSE;
possitionMiddle =真;
}否则如果(possitionMiddle&安培;&安培;!possitionTop){
mScrollView.fullScroll(ScrollView.FOCUS_DOWN);
possitionTop = FALSE;
possitionMiddle = FALSE;
}
}否则如果((e2.getY() - e1.getY())> sensitvity){
刷卡+ =向下滑动\\ N的;
如果(possitionMiddle&安培;&安培;!possitionTop){
mScrollView.fullScroll(ScrollView.FOCUS_UP);
possitionTop = TRUE;
possitionMiddle = FALSE;
}
如果(possitionMiddle&安培;!&安培;!possitionTop){
mScrollView
.scrollTo(mScrollView.getBottom(),mLayoutHeight);
possitionTop = FALSE;
possitionMiddle =真;
}
}其他{
刷卡+ =\\ n;
}
Log.d(TAG,轻扫);
返回super.onFling(E1,E2,velocityX,velocityY);
}};GestureDetector mGestureDetector =新GestureDetector(
simpleOnGestureListener);
}
下面是布局
<?XML版本=1.0编码=UTF-8&GT?;
<滚动型的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:ID =@ + ID / SCRV
机器人:layout_width =match_parent
机器人:layout_height =FILL_PARENT
机器人:fillViewport =真
机器人:滚动条=无><的LinearLayout
机器人:ID =@ + ID / container2的
机器人:layout_width =match_parent
机器人:layout_height =FILL_PARENT
机器人:背景=#1E1E1E
机器人:baselineAligned =假
机器人:方向=垂直> <的LinearLayout
机器人:ID =@ + ID /顶
机器人:layout_width =match_parent
机器人:layout_height =100dp
机器人:背景=@机器人:彩色/黑白
机器人:baselineAligned =假
机器人:方向=垂直>
< / LinearLayout中> <的LinearLayout
机器人:ID =@ + ID /中
机器人:layout_width =match_parent
机器人:layout_height =100dp
机器人:背景=@机器人:彩色/白
机器人:baselineAligned =假
机器人:方向=垂直> <按钮
机器人:ID =@ + ID /按钮
风格=机器人:ATTR / buttonStyleSmall
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:文字=按钮/>
< / LinearLayout中> <的LinearLayout
机器人:ID =@ + ID /底
机器人:layout_width =match_parent
机器人:layout_height =200dp
机器人:背景=@机器人:彩色/ darker_gray
机器人:baselineAligned =假
机器人:方向=垂直>
< / LinearLayout中>
< / LinearLayout中>
找到这里 Android的滚动型与GestureDetector
How to create Android UI like this
01 and 02 layouts height should be 1/3 of the devise's height. by default layout should show black area, ones scroll down it should show 01 and the 2/3 of the black layout.
- if the main view shows 01 and the 2/3 of the black layout and user scroll up then it should navigate to main layout(black layout)
解决方案
Finally I found the solution
import android.os.Bundle;
import android.app.Activity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Toast;
public class ScrollLayoutActivity extends Activity {
private static String TAG = ScrollLayoutActivity.class.getSimpleName();
private LinearLayout mTopLayout;
private LinearLayout mMiddleLayout;
private LinearLayout mBottomLayout;
private ScrollView mScrollView;
private boolean possitionTop;
private boolean possitionMiddle = true;
int mLayoutHeight;
float mDeviceHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scroll_layouts);
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
// final float height=displayMetrics.heightPixels/displayMetrics.xdpi;
// device height in pixels
mDeviceHeight = displayMetrics.heightPixels;
mLayoutHeight = (int) mDeviceHeight / 3;
mScrollView = (ScrollView) findViewById(R.id.scrv);
mTopLayout = (LinearLayout) findViewById(R.id.top);
mMiddleLayout = (LinearLayout) findViewById(R.id.middle);
mBottomLayout = (LinearLayout) findViewById(R.id.bottom);
mTopLayout.setLayoutParams(new LinearLayout.LayoutParams(mTopLayout
.getLayoutParams().width, mLayoutHeight));
mBottomLayout.setLayoutParams(new LinearLayout.LayoutParams(
mBottomLayout.getLayoutParams().width, mLayoutHeight));
mMiddleLayout.setLayoutParams(new LinearLayout.LayoutParams(
mMiddleLayout.getLayoutParams().width, (int) mDeviceHeight));
mScrollView.setHorizontalFadingEdgeEnabled(false);
mScrollView.setVerticalFadingEdgeEnabled(false);
mScrollView.post(new Runnable() {
public void run() {
mScrollView.scrollTo(0, mLayoutHeight);
}
});
// findViewById(R.id.button).setOnClickListener(new
// View.OnClickListener() {
//
// @Override
// public void onClick(View v) {
// Toast.makeText(ScrollLayoutActivity.this, "height : " +
// mDeviceHeight, Toast.LENGTH_SHORT).show();
// }
// });
Toast.makeText(this, "Device Height : " + mDeviceHeight,
Toast.LENGTH_SHORT).show();
}
public boolean dispatchTouchEvent(MotionEvent ev) {
return mGestureDetector.onTouchEvent(ev);
}
SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
String swipe = "";
float sensitvity = 100;
if ((e1.getX() - e2.getX()) > sensitvity) {
swipe += "Swipe Left\n";
} else if ((e2.getX() - e1.getX()) > sensitvity) {
swipe += "Swipe Right\n";
} else {
swipe += "\n";
}
if ((e1.getY() - e2.getY()) > sensitvity) {
swipe += "Swipe Up\n";
if (!possitionMiddle && possitionTop) {
mScrollView.scrollBy(0, mLayoutHeight);
possitionTop = false;
possitionMiddle = true;
} else if (possitionMiddle && !possitionTop) {
mScrollView.fullScroll(ScrollView.FOCUS_DOWN);
possitionTop = false;
possitionMiddle = false;
}
} else if ((e2.getY() - e1.getY()) > sensitvity) {
swipe += "Swipe Down\n";
if (possitionMiddle && !possitionTop) {
mScrollView.fullScroll(ScrollView.FOCUS_UP);
possitionTop = true;
possitionMiddle = false;
}
if (!possitionMiddle && !possitionTop) {
mScrollView
.scrollTo(mScrollView.getBottom(), mLayoutHeight);
possitionTop = false;
possitionMiddle = true;
}
} else {
swipe += "\n";
}
Log.d(TAG, swipe);
return super.onFling(e1, e2, velocityX, velocityY);
}
};
GestureDetector mGestureDetector = new GestureDetector(
simpleOnGestureListener);
}
Here is the layout
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrv"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:scrollbars="none" >
<LinearLayout
android:id="@+id/container2"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:background="#1E1E1E"
android:baselineAligned="false"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/top"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@android:color/black"
android:baselineAligned="false"
android:orientation="vertical" >
</LinearLayout>
<LinearLayout
android:id="@+id/middle"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@android:color/white"
android:baselineAligned="false"
android:orientation="vertical" >
<Button
android:id="@+id/button"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
<LinearLayout
android:id="@+id/bottom"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@android:color/darker_gray"
android:baselineAligned="false"
android:orientation="vertical" >
</LinearLayout>
</LinearLayout>
find more details from here Android ScrollView with GestureDetector
这篇关于Android的布局与滚动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文