基本用法
1、自定义一个View
2、创建一个ViewDragHelper的实例
3、触摸相关的方法的调用
4、ViewDragHelper.Callback实例的编写
需要注意的地方:如果ViewGroup的子控件会消耗点击事件,例如按钮,在触摸屏幕的时候就会先走onInterceptTouchEvent方法,判断是否可以捕获,而在判断的过程中会去判断另外两个回调的方法:getViewHorizontalDragRange和getViewVerticalDragRange,只有这两个方法返回大于0的值才能正常的捕获。
注意如果需要使用边界检测需要添加上mDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
ViewDragHelper.Callback中的一些回调方法:
tryCaptureView()
@Override
public boolean tryCaptureView(View child, int pointerId) {
return child == mDragView || child == mAutoBackView;
}
返回true表示捕获当前touch到的view,可以根据第一个参数child决定捕获哪些view。child是当前触摸到的view。这里的返回代表mDragView和mAutoBackView可以被捕获。
clampViewPositionHorizontal()
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
return left;
}
在该方法中对child移动的边界进行控制,left表示即将移动到的位置。比如横向的情况下,我希望只在ViewGroup的内部移动,即:最小>=paddingleft,最大<=ViewGroup.getWidth()-paddingright-child.getWidth
clampViewPositionVertical()
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
return top;
}
与上面的类似,控制纵向移动的时候边界的控制
onViewReleased()
public void onViewReleased(View releasedChild, float xvel, float yvel) {
super.onViewReleased(releasedChild, xvel, yvel);
//mAutoBackView手指释放时可以自动回去
if (releasedChild == mAutoBackView)
{
//settleCapturedViewAt可以设置捕获的view到指定的位置,传入的参数是x、y的值
mDragger.settleCapturedViewAt(mAutoBackOriginPos.x, mAutoBackOriginPos.y);
invalidate();
}
}
手指离开当前捕获的View的时候,会回调这个方法
onEdgeDragStarted()
public void onEdgeDragStarted(int edgeFlags, int pointerId)
{
//captureChildView可以捕获view,并且绕过tryCaptureView,所以就算是tryCaptureView没有返回true也没关系
mDragger.captureChildView(mEdgeTrackerView, pointerId);
}
在边界拖动时回调
getViewHorizontalDragRange()
@Override
public int getViewHorizontalDragRange(View child) {
super.getViewHorizontalDragRange(child);
return getMeasuredWidth() - child.getMeasuredWidth();
}
@Override
public int getViewVerticalDragRange(View child) {
super.getViewVerticalDragRange(child);
return getMeasuredHeight() - child.getMeasuredHeight();
}
方法的返回值应当是该childView横向或者纵向的移动的范围,当前如果只需要一个方向移动,可以只复写一个。
onViewDragStateChanged()
@Override
public void onViewDragStateChanged(int state) {
super.onViewDragStateChanged(state);
Log.d("zwf", String.valueOf(state));
}
当ViewDragHelper状态发生变化的时候调用(IDLE,DRAGGING,SETTING[自动滚动时])
onViewPositionChanged()
@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
super.onViewPositionChanged(changedView, left, top, dx, dy);
}
当captureView的位置发生变化是回调
@param changedView
@param left 将要移动到的x轴方向的位置
@param top 将要移动到的y轴方向的位置
@param dx x轴偏移量
@param dy y轴偏移量
onViewCaptured()
@Override
public void onViewCaptured(View capturedChild, int activePointerId) {
super.onViewCaptured(capturedChild, activePointerId);
}
当captureView被捕获的时候调用
onEdgeTouched()
@Override
public void onEdgeTouched(int edgeFlags, int pointerId) {
super.onEdgeTouched(edgeFlags, pointerId);
}
触摸到边界 的时候调用
onEdgeLock()
@Override
public boolean onEdgeLock(int edgeFlags) {
return super.onEdgeLock(edgeFlags);
}
返回true会锁住当前的边界
getOrderedChildIndex()
@Override
public int getOrderedChildIndex(int index) {
return super.getOrderedChildIndex(index);
}
改变同一个坐标(x,y)去寻找captureView位置的方法