ViewDragHelper通常是在一个ViewGroup内部使用。使用步骤如下:
1.初始化ViewDragHelper:在一个自定义的ViewGroup里面(暂且命名为TestViewGroup),通过ViewDragHelper静态工厂方法初始化。
ViewDragHelper viewDragHelper = ViewDragHelper.create(TestViewGroup.this,callback);
这里需要一个ViewDragHelper.Callback
private ViewDragHelper.Callback callback = new ViewDragHelper.Callback() {
//何时开始检测触摸事件
@Override
public boolean tryCaptureView(@NonNull View child, int pointerId) {
//这里可以设置一个条件,返回该条件的结果
//当该条件结果为true时,开始检测触摸事件
return true;
}
//处理水平滑动
@Override
public int clampViewPositionHorizontal(@NonNull View child, int left, int dx) {
return left;
}
//处理垂直滑动
@Override
public int clampViewPositionVertical(@NonNull View child, int top, int dy) {
return top;
}
//拖动结束手指释放后
@Override
public void onViewReleased(@NonNull View releasedChild, float xvel, float yvel) {
super.onViewReleased(releasedChild, xvel, yvel);
//这里进行的是让view返回原点的操作
mViewDragHelper.smoothSlideViewTo(mChildView, 0, 0);
ViewCompat.postInvalidateOnAnimation(TestViewGroup.this);
}
};
2.重写事件拦截方法,将事件传递给ViewDragHelper处理。代码如下:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return mViewDragHelper.shouldInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//这里必须将触摸事件传递给ViewDragHelper
mViewDragHelper.processTouchEvent(event);
return true;
}
3.处理computeScroll(),代码模板如下:
@Override
public void computeScroll() {
super.computeScroll();
if (mViewDragHelper.continueSettling(true)) {
ViewCompat.postInvalidateOnAnimation(TestViewGroup.this);
}
}
4.处理1中callback中对应的方法。详见1中注解
5.获取一下子view以对其进行操作
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mChildView = getChildAt(0);
}
6.相关xml布局
<com.lykevin.testmodule.TestViewGroup
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button" />
</com.lykevin.testmodule.TestViewGroup>