Google在其support库中为我们提供了DrawerLayout和SlidingPaneLayout两个布局来帮助开发者实现侧边栏滑动的效果。这两个新的布局,大大方便了我们创建自己的滑动布局界面。然而,这两个功能强大的布局背后,却隐藏着一个鲜为人知却功能强大的类——ViewDragHelper。通过ViewDragHelper,基本可以实现各种不同的滑动、拖放要求,因此这个方法也是各种滑动解决方案中的终极绝招
初始化ViewDragHelper
首先,自然是需要初始化ViewDragHelper,ViewDragHelper通常定义在一个ViewGroup的内部,并通过静态工厂方法进行初始化,代码如下
mViewDragHelper=ViewDragHelper.create(this,callback);它的第一个参数是要监听的View,通常需要一个ViewGroup,第二个参数是一个callback回调。
拦截事件
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { mViewDragHelper.shouldInterceptTouchEvent(ev); return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { mViewDragHelper.processTouchEvent(event); return true; }
处理回调Callback
IDE自动帮我们重写了一个方法tryCaptureView,通过这个方法,我们可以指定在创建ViewDragHelper时,参数parentView中的nayige
clampViewPositionVertical()和clampViewPositionHorizontal(),分别对应垂直和水平方向上的滑动
new ViewDragHelper.Callback() { @Override public boolean tryCaptureView(View child, int pointerId) { return mMain1==child; } @Override public int clampViewPositionVertical(View child, int top, int dy) { return top; } @Override public int clampViewPositionHorizontal(View child, int left, int dx) { return left; } }
onFinishInflate()方法中按顺序将子View分别定义成mMain1和mMain2并获得
@Override protected void onFinishInflate() { super.onFinishInflate();mMain1=getChildAt(0);}mMain2=getChildAt(1);