一、ViewDragHelper
一个自定义ViewGroup的工具类,它提供了许多有用的方法和状态允许用户去拖拽和绘制子View在自定义ViewGroup中的轨迹和位置。
ViewDragHelper可以使用静态方法创建一个实例:
ViewDragHelper.create(ViewGroup forParent,int sensitiveity,ViewDragHelper.Callback cb)
在自定义ViewGroup中,ViewDragHelper可以帮助我们来分析手势和处理拖动:
@Override public boolean onTouchEvent(MotionEvent event) { try { //处理触摸事件 mDragHelper.processTouchEvent(event); } catch (Exception e) { e.printStackTrace(); } //返回true, return true; }
使用ViewDragHelper来动态移动自定义ViewGroup中的控件:
public boolean smoothSlideViewTo(View child, int finalLeft, int finalTop) // Animate the view child to the given (left, top) position. // 返回true 代表还没有移动到指定的位置,需要刷新界面,继续移动 // 返回false 就停止工作
使用ViewDragHelper滑动边缘监听:
// 监听左边缘滑动 setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
二、 ViewDragHelper.Callback
ViewDragHelper.Callback集成了许多可覆写的方法,所有移动的控制在ViewDragHelper.Callback里面来实现。
是否可以捕捉ViewGroup中的子组件:
public boolean tryCaptureView(View child, int pointerId) { //返回true,就代表着可对该子组件处理滑动事件。否则就不会处理。 return true; //只对特定的组件捕捉 return speChild == child; }
// 使用ViewDragHelper的captureChildView捕捉子组件,该方法可以绕过tryCaptureView方法
clampViewPositionHorizontal[Vertical]:
处理子组件在水平或者竖直方向的滑动限制,在这个方法内部做子组件的边界处理,就是确保子组件不会滑过界。
例如在竖直方向进行滑动时,一般先获取控件可滑动到的顶端Y值和底端Y值,再进行一个取值
@Override public int clampViewPositionVertical(View child, int top, int dy) { //手指触摸移动时实时回调, top表示要到的y位置 int topBound = ...; int bottomBound = ...; return Math.min(Math.max(topBound, top), bottomBound); }
onViewPositionChanged
当前拖动的子组件位置变化时调用的方法。一般在该方法里调整其他子组件的位置。@Override public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { //changedV