android view移动总结
来源:互联网 发布:微信小说网站源码 编辑:程序博客网 时间:2024/04/26 08:28
第一类原理:layout方式
1、直接调用viewgroup的layout()方法来layout子view。麻烦的是你要计算出left、top、right、bottom这四个参数的值
2、使用MarginLayoutParam,使view的外层ViewGroup来layout该view。一般都这么写:
ViewGroup.MarginLayoutParams layoutParams = view.getLayoutParams();// layoutParams.bottomMargin =// layoutParams.leftMargin = view.requestLayout();
第二类:scrollTo
适用于容器的内容的长度大于该view的可见区,例如scrollview。
第三类:view的setTranslationY和setTranslationX
第四类:view.offsetLeftAndRight(offset)和offsetTopAndBottom(offset)
手势相关:GestureDetector:无限制ViewDragHelper:用在自定义viewgroup中。
GestureDetector用法:
view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { gestureDetector.onTouchEvent(event); return false; } });
或者在自定义view的onTouchEvent()中gestureDetector.onTouchEvent(event);Listener一般用GestureDetector.SimpleOnGestureListener
ViewDragHelper用法:
package com.example.vdh;import android.content.Context;import android.graphics.Point;import android.support.v4.widget.ViewDragHelper;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.LinearLayout;/** * ViewDragHelper 的使用 * */public class VDHLayout extends LinearLayout { private ViewDragHelper mDragger; private View mFirstView,mSecondView,mThirdView; private Point secondPosition = new Point(); //记录第二个view的左和顶部的位置 public VDHLayout(Context context) { super(context); } public VDHLayout(Context context, AttributeSet attrs) { super(context, attrs); mDragger = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() { @Override public boolean tryCaptureView(View child, int pointerId) { //mFirstView禁止直接移动 return child == mSecondView || child == mThirdView; } @Override public int clampViewPositionHorizontal(View child, int left, int dx) { return left; } @Override public int clampViewPositionVertical(View child, int top, int dy) { return top; } //手指释放的时候回调 @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { //mAutoBackView手指释放时可以自动回去 if (releasedChild == mSecondView) { mDragger.settleCapturedViewAt(secondPosition.x, secondPosition.y); invalidate(); } } //在边界拖动时回调 @Override public void onEdgeDragStarted(int edgeFlags, int pointerId) { mDragger.captureChildView(mFirstView, pointerId); } }); mDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT); } public VDHLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptHoverEvent(MotionEvent event) { return mDragger.shouldInterceptTouchEvent(event); //由mDragger来处理intercept } @Override public boolean onTouchEvent(MotionEvent event) { mDragger.processTouchEvent(event); return true; //mDragger已处理,直接返回true } @Override public void computeScroll() { if(mDragger.continueSettling(true)){ invalidate(); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed,l,t,r,b); //记住mSecondView的位置 secondPosition.x = mSecondView.getLeft(); secondPosition.y = mSecondView.getTop(); } @Override protected void onFinishInflate() { super.onFinishInflate(); mFirstView = getChildAt(0); mSecondView = getChildAt(1); mThirdView = getChildAt(2); }}
Activity中xml布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello World, MyActivity" /> <com.example.vdh.VDHLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center"> <View android:layout_width="80dp" android:layout_height="80dp" android:background="#666666"/> <View android:layout_width="80dp" android:layout_height="80dp" android:background="#ee6666"/> <View android:layout_width="80dp" android:layout_height="80dp" android:background="#55ff66"/> </com.example.vdh.VDHLayout></LinearLayout>
效果:
参考:http://blog.csdn.net/lmj623565791/article/details/46858663
http://blog.csdn.net/pi9nc/article/details/39583377
ViewDragHelper:用在自定义viewgroup中。
GestureDetector用法:
view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { gestureDetector.onTouchEvent(event); return false; } });或者在自定义view的onTouchEvent()中gestureDetector.onTouchEvent(event);Listener一般用GestureDetector.SimpleOnGestureListenerViewDragHelper用法:
package com.example.vdh;import android.content.Context;import android.graphics.Point;import android.support.v4.widget.ViewDragHelper;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.LinearLayout;/** * ViewDragHelper 的使用 * */public class VDHLayout extends LinearLayout { private ViewDragHelper mDragger; private View mFirstView,mSecondView,mThirdView; private Point secondPosition = new Point(); //记录第二个view的左和顶部的位置 public VDHLayout(Context context) { super(context); } public VDHLayout(Context context, AttributeSet attrs) { super(context, attrs); mDragger = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() { @Override public boolean tryCaptureView(View child, int pointerId) { //mFirstView禁止直接移动 return child == mSecondView || child == mThirdView; } @Override public int clampViewPositionHorizontal(View child, int left, int dx) { return left; } @Override public int clampViewPositionVertical(View child, int top, int dy) { return top; } //手指释放的时候回调 @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { //mAutoBackView手指释放时可以自动回去 if (releasedChild == mSecondView) { mDragger.settleCapturedViewAt(secondPosition.x, secondPosition.y); invalidate(); } } //在边界拖动时回调 @Override public void onEdgeDragStarted(int edgeFlags, int pointerId) { mDragger.captureChildView(mFirstView, pointerId); } }); mDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT); } public VDHLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptHoverEvent(MotionEvent event) { return mDragger.shouldInterceptTouchEvent(event); //由mDragger来处理intercept } @Override public boolean onTouchEvent(MotionEvent event) { mDragger.processTouchEvent(event); return true; //mDragger已处理,直接返回true } @Override public void computeScroll() { if(mDragger.continueSettling(true)){ invalidate(); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed,l,t,r,b); //记住mSecondView的位置 secondPosition.x = mSecondView.getLeft(); secondPosition.y = mSecondView.getTop(); } @Override protected void onFinishInflate() { super.onFinishInflate(); mFirstView = getChildAt(0); mSecondView = getChildAt(1); mThirdView = getChildAt(2); }}
Activity中xml布局:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello World, MyActivity" /> <com.example.vdh.VDHLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center"> <View android:layout_width="80dp" android:layout_height="80dp" android:background="#666666"/> <View android:layout_width="80dp" android:layout_height="80dp" android:background="#ee6666"/> <View android:layout_width="80dp" android:layout_height="80dp" android:background="#55ff66"/> </com.example.vdh.VDHLayout></LinearLayout>
效果:参考:http://blog.csdn.net/lmj623565791/article/details/46858663
http://blog.csdn.net/pi9nc/article/details/39583377
0 0
- android view移动总结
- Android中移动view的方法总结
- Android-View 移动的相关方法总结
- Android 中 View移动总结:ViewDragHelper学习及用法详解
- Android 中 View移动总结:ViewDragHelper学习及用法详解
- Android 中 View移动总结:ViewDragHelper学习及用法详解
- android移动view
- android view 移动
- android 移动view
- android移动View
- 学习总结--View 的移动
- Android移动view动画问题
- Android移动view动画问题
- Android移动view动画问题
- Android移动view动画问题
- Android View 拖拽 移动 碰撞
- android view 焦点总结
- android View 总结
- CSU 1120 病毒
- HUD 1564 Play a game【博弈论】
- [组合数学] 第一类,第二类Stirling数,Bell数
- hdu-2116-Has the sum exceeded
- 第五周第一天(数据库)
- android view移动总结
- android 实现QQ好友分享和QQ空间分享
- 常见的攻击方式详解
- 智力题
- hdu3572Task Schedule 最大流
- GDC Tips For Students & The GDC Survival Guide
- HDFS客户端的权限错误:Permission denied
- hdu 4734 F(x) 数位DP
- 页面定时跳转(倒计时跳转)代码总结