ViewDragHelper的使用

Posted 技术丶从积累开始

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ViewDragHelper的使用相关的知识,希望对你有一定的参考价值。

作用:   

ViewDragHelper并不是直接作用于要被拖动的View,而是使其控制的视图容器中的子View可以被拖动,如果要指定某个子view的行为,需要在Callback中想办法;

使用步骤(实现侧滑栏):

1、将ViewGroup中的点击事件都交给ViewDragHelper

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return mViewDragHelper.shouldInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    mViewDragHelper.processTouchEvent(event);
    return true;
}
传递点击事件

2、重写ViewDragHelper.Callback,事件的回调都在Callback处理

   private ViewDragHelper.Callback mCallback = new ViewDragHelper.Callback() {
        @Override
        //当松手的时候回调该方法
        public void onViewReleased(View releasedChild, float xvel, float yvel) {
            super.onViewReleased(releasedChild, xvel, yvel);
//mLinearMain.getLeft()的效果竟然与mLinearMain.getScrollX()一样
            if (mLinearMain.getLeft() < 100){
               //弹性滑动到0,0点 mViewDragHelper.smoothSlideViewTo(mLinearMain,0,0);
            }
            else {
                 //弹性滑动到300,0点 mViewDragHelper.smoothSlideViewTo(mLinearMain,300,0);
            }
            Log.d(TAG,mLinearMain.getX()+"");
          ViewCompat.postInvalidateOnAnimation(SliderFrameLayout.this);
        }
      //是否让所点击的View移动
       @Override
        public boolean tryCaptureView(View child, int pointerId) {
            boolean isMove = false;
            if (child == mLinearMain)
                isMove = true;
            return isMove;
        }
      //横向移动  当然还有纵向移动的方法
        @Override
        public int clampViewPositionHorizontal(View child, int left, int dx) {
            return left;
        }
    };
实现Callback

3、因为mViewDragHelper.smoothSlideViewTo(mLinearMain,0,0);方法内部是实现了Scroller.startScroll()

所以需要调用父View的computeScroll()方法

     @Override
     public void computeScroll() {
         super.computeScroll();
         if (mViewDragHelper.continueSettling(true)){
             //ViewCompat用于版本兼容的
             ViewCompat.postInvalidateOnAnimation(this);
         }
     }
View Code

4、创建ViewDragHelper

    public void initView(){
        mViewDragHelper = ViewDragHelper.create(this,mCallback);
    }
创建View

过程中产生的问题:

1、为什么子View的getLeft()能够与getScrollX()得到是一样的

2、RelativeLayout,无法实现子类超出其Width和Height。

3、如何创建左侧滑栏的布局。查到的原理:创建HorizonSliderLayout,然后在onLayout()方法中使用scrollTo()创造的时候让侧滑栏先滑到左边去

详解:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0911/1680.html

以上是关于ViewDragHelper的使用的主要内容,如果未能解决你的问题,请参考以下文章

Android使用ViewDragHelper实现侧滑菜单

使用ViewDragHelper打造属于自己的DragLayout(抽屉开关 )

ViewDragHelper完全解析, 自定义ViewGroup神器

Android拖拽助手ViewDragHelper

滑动 ViewDragHelper DrawerLayout

史上最全的Android ViewDragHelper解析