android|android view滑动学习笔记

viewDragHelper仿qq侧滑的效果

学习资料 《android群英传》
老规矩先上图

android|android view滑动学习笔记
文章图片
1.gif 滑动的本质就是移动一个view,改变其当前所在的位置,它的原理与动画效果实现非常相似。都是通过不断的改变view的坐标来实现这一效果。
所以就必须监听用户触摸的事件,并传入坐标,动态的不断的改变坐标,从而实现view跟随用户的触摸滑动而滑动。
先学习viewDragHelper的基本用法
一,初始化ViewDragHelper
public DragView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } private void initView() { viewDragHelper=ViewDragHelper.create(this,callback); }

【android|android view滑动学习笔记】二,重写拦截事件方法
触摸事件的方法
//拦截事件 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return viewDragHelper.shouldInterceptTouchEvent(ev); } //触摸事件 @Override public boolean onTouchEvent(MotionEvent event) { viewDragHelper.processTouchEvent(event); return true; }

只要这三步,实现的是触摸滑动,如图:
三,处理computeScollege()
四,处理回调Callback(); 关键部分
public ViewDragHelper.Callback callback= new ViewDragHelper.Callback() { //tryCaptureView如何返回ture则表示可以捕获该view,你可以根据传入的第一个view参数决定哪些可以捕获 @Override public boolean tryCaptureView(View child, int pointerId) { return true; } //处理水平滑动,返回左边的坐标,可以进行计算,layout方法进行设置显示的位置 @Override public int clampViewPositionHorizontal(View child, int left, int dx) { return left; } //处理垂直滑动和处理水平的思想一样 @Override public int clampViewPositionVertical(View child, int top, int dy) { return top; }

五,onViewRelease方法,拖动结束后进行调用
六,通过以上学习,实现一个qq侧滑功能如图

android|android view滑动学习笔记
文章图片
4.gif 侧滑其实和view滑动原理是一样的
我把自己理解的需要注意和重点分为以下几点;
一,侧滑其实就是两个view,他们的图层不同,在xml布局中需要把菜单和主界面区分好,如图:activity_main.xml

就这几行代码非常简单,两个TextView,一个作为主界面,一个作为菜单。
菜单在主界面的前面,所以这两个图层在手机上会,显示第二个TextView。
当它进行滑动时,(这里只允许进行水平滑动)底层的Textview就会显示出来。
//拖动结束后调用 //@Override //public void onViewReleased(View releasedChild, float xvel, float yvel) { //super.onViewReleased(releasedChild, xvel, yvel); //if (mMainView.getLeft()<500){ ////关闭菜单 ////相当 //viewDragHelper.smoothSlideViewTo(mMainView,0,0); ////这句相当于重绘 //ViewCompat.postInvalidateOnAnimation(DragView.this); //}else { ////把mMainView设置到固定的位置 //viewDragHelper.smoothSlideViewTo(mMainView,300,0); //ViewCompat.postInvalidateOnAnimation(DragView.this); //} //}


拖动后的回调,这里需要把上层的TextView进行限制,不然Textview的位置就会随着手指拖动乱跑。这里限制当主界面的左侧小于500,关闭菜单,其实就是把主界面覆盖上去。

mMainView 和mMenuView通过onFinishInflate方法创建实例
//加载布局文件后调用 @Override protected void onFinishInflate() { super.onFinishInflate(); mMenuView=getChildAt(0); mMainView=getChildAt(1); }

如有错误或异议,欢迎指正留言。

    推荐阅读