ViewDragHelper

2016-11-17  本文已影响23人  卖梦想的男孩

ViewDragHelper is a utility class for writing custom ViewGroups. It offers a number* of useful operations and state tracking for allowing a user to drag and reposition* views within their parent ViewGroup.

ViewDragHelper在support v4中,目的很明确,就是方便ViewGroup管理子View的拖拽和摆放。

1. 创建

Helper提供了两个静态方法

 - forParent 监控的父类
 - sensitivity  灵敏度,越大越灵敏,默认1
 - cb 各种回调事件
public static ViewDragHelper create(ViewGroup forParent, Callback cb);
public static ViewDragHelper create(ViewGroup forParent, float sensitivity, Callback cb);

2. 事件拦截

@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {
  return mDragHelper.shouldInterceptTouchEvent(ev)
}

@Overridepublic boolean onTouchEvent(MotionEvent ev) {  
  mDragHelper.processTouchEvent(ev);   
  return super.onTouchEvent(ev);
}

3. 回调管理

public boolean tryCaptureView(final View child, final int pointerId)
public void onViewCaptured(final View capturedChild, final int activePointerId)
public void onViewPositionChanged(final View changedView, final int left, final int top, final int dx, final int dy)
public void onViewReleased(final View releasedChild, final float xvel, final float yvel)
public void onEdgeTouched(final int edgeFlags, final int pointerId)
public boolean onEdgeLock(final int edgeFlags)
public void onEdgeDragStarted(final int edgeFlags, final int pointerId)
public int getOrderedChildIndex(final int index)
public int getViewHorizontalDragRange(final View child)
public int getViewVerticalDragRange(final View child) 
public int clampViewPositionHorizontal(final View child, final int left, final int dx)
public int clampViewPositionVertical(final View child, final int top, final int dy)

Helper 常用方法

public boolean settleCapturedViewAt(int finalLeft, int finalTop)

需要配合computeScroll完成动画,实质是调用Scroller的startScroll

@Overridepublic void computeScroll() {   
 if(mDragHelper.continueSettling(true)) {
        postInvalidate();  
}
}
public void setEdgeTrackingEnabled(int edgeFlags)

一般配合回调中的边缘事件,手动设置捕获的View,然后做移动

public void captureChildView(View childView, int activePointerId)
上一篇 下一篇

猜你喜欢

热点阅读