android view滑动学习笔记

viewDragHelper仿qq侧滑的效果

学习资料 《android群英传》

老规矩先上图


android view滑动学习笔记_第1张图片
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);
}

二,重写拦截事件方法
触摸事件的方法

//拦截事件
@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 view滑动学习笔记_第2张图片
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);
    }

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

你可能感兴趣的:(android view滑动学习笔记)