android View 跟随手指移动的7种方式
2016-11-04 00:04
441 查看
###View 跟随手指移动的7种方式
. layout方法
底层还是1 系统封装好的偏移方法。
MarginlayoutParams LayoutParams 的leftMargin topmargin
scrollTo scrollBy
Scroller
属性动画(后边详细讲)
support包中的ViewDragHelper
. layout方法
底层还是1 系统封装好的偏移方法。
MarginlayoutParams LayoutParams 的leftMargin topmargin
scrollTo scrollBy
Scroller
属性动画(后边详细讲)
support包中的ViewDragHelper
1.layout方法
2.offsetLeftAndRight(offsetX); offsetTopAndBottom(offsetY);
// 视图坐标方式 @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 记录触摸点坐标 lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: // 计算偏移量 int offsetX = x - lastX; int offsetY = y - lastY; // 在当前left、top、right、bottom的基础上加上偏移量 layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY); // offsetLeftAndRight(offsetX); // offsetTopAndBottom(offsetY); break; } return true; }
3.LayoutParams
case MotionEvent.ACTION_MOVE: // 计算偏移量 int offsetX = x - lastX; int offsetY = y - lastY; ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams(); // LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams(); layoutParams.leftMargin = getLeft() + offsetX; 4000 layoutParams.topMargin = getTop() + offsetY; setLayoutParams(layoutParams); break;
scrollBy
case MotionEvent.ACTION_MOVE: int offsetX = x - lastX; int offsetY = y - lastY; ((View) getParent()).scrollBy(-offsetX, -offsetY); break;
scroller
private void ininView(Context context) { setBackgroundColor(Color.BLUE); // 第一步 初始化Scroller mScroller = new Scroller(context); } //第二步 此方法为模板代码 @Override public void computeScroll() { super.computeScroll(); // 判断Scroller是否执行完毕 if (mScroller.computeScrollOffset()) { ((View) getParent()).scrollTo( mScroller.getCurrX(), mScroller.getCurrY()); // 通过重绘来不断调用computeScroll invalidate(); } } @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getX(); lastY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: int offsetX = x - lastX; int offsetY = y - lastY; ((View) getParent()).scrollBy(-offsetX, -offsetY); break; case MotionEvent.ACTION_UP: // 手指离开时,执行滑动过程 View viewGroup = ((View) getParent()); //第三部 启动scroller mScroller.startScroll( viewGroup.getScrollX(),//当前view的左上角相对于母视图的左上角的X轴偏移量 viewGroup.getScrollY(),//开始的x y -viewGroup.getScrollX(), -viewGroup.getScrollY());//滑动的distanceXY invalidate(); break; } return true; }
ViewDragHelper
public class DragViewGroup extends FrameLayout { private ViewDragHelper mViewDragHelper; private View mMenuView, mMainView; private int mWidth; public DragViewGroup(Context context) { super(context); initView(); } public DragViewGroup(Context context, AttributeSet attrs) { super(context, attrs); initView(); } public DragViewGroup(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } @Override protected void onFinishInflate() { super.onFinishInflate(); mMenuView = getChildAt(0); mMainView = getChildAt(1); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWidth = mMenuView.getMeasuredWidth(); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return mViewDragHelper.shouldInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { //将触摸事件传递给ViewDragHelper,此操作必不可少 mViewDragHelper.processTouchEvent(event); return true; } private void initView() { mViewDragHelper = ViewDragHelper.create(this, callback); } private ViewDragHelper.Callback callback = new ViewDragHelper.Callback() { // 何时开始检测触摸事件 @Override public boolean tryCaptureView(View child, int pointerId) { //如果当前触摸的child是mMainView时开始检测 return mMainView == child; } // 触摸到View后回调 @Override public void onViewCaptured(View capturedChild, int activePointerId) { super.onViewCaptured(capturedChild, activePointerId); } // 当拖拽状态改变,比如idle,dragging @Override public void onViewDragStateChanged(int state) { super.onViewDragStateChanged(state); } // 当位置改变的时候调用,常用与滑动时更改scale等 @Override public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { super.onViewPositionChanged(changedView, left, top, dx, dy); } // 处理垂直滑动 @Override public int clampViewPositionVertical(View child, int top, int dy) { return 0; } // 处理水平滑动 @Override public int clampViewPositionHorizontal(View child, int left, int dx) { return left; } // 拖动结束后调用 @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { super.onViewReleased(releasedChild, xvel, yvel); //手指抬起后缓慢移动到指定位置 if (mMainView.getLeft() < 500) { //关闭菜单 //相当于Scroller的startScroll方法 mViewDragHelper.smoothSlideViewTo(mMainView, 0, 0); ViewCompat.postInvalidateOnAnimation(DragViewGroup.this); } else { //打开菜单 mViewDragHelper.smoothSlideViewTo(mMainView, 300, 0); ViewCompat.postInvalidateOnAnimation(DragViewGroup.this); } } }; @Override public void computeScroll() { if (mViewDragHelper.continueSettling(true)) { ViewCompat.postInvalidateOnAnimation(this); } } } <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <com.imooc.dragviewtest.DragViewGroup android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/view"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_light"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Menu" /> </FrameLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_orange_dark"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Main" /> </FrameLayout> </com.imooc.dragviewtest.DragViewGroup> </RelativeLayout>
相关文章推荐
- android View 跟随手指移动的7种方式
- android View 跟随手指移动的7种方式
- android View 跟随手指移动的7种方式
- android View 跟随手指移动的7种方式
- android View 跟随手指移动的7种方式
- android View 跟随手指移动的7种方式
- android View 跟随手指移动的7种方式
- android View 跟随手指移动的7种方式
- android从零开始-开发自定义View-跟随手指移动的小球
- Android实现View拖拽跟随手指移动效果
- Android 实例:通过自定义View组件实现跟随手指移动的小兔子
- android 跟随手指移动的 view
- Android中View跟随手指移动效果
- Android自定义圆形View实现小球跟随手指移动效果
- Android最简单的实现View拖拽跟随手指移动效果
- Android开发——自定义View之实现跟随手指移动的小球
- Android-通过自定义View组件实现跟随手指移动的ImageView组件
- android引导页下方圆点位置跟随手指移动的实现
- Android---26---跟随手指移动的小球
- Android开发之控件跟随手指移动(2)