1、概述
在自定义ViewGroup中,很多效果都包含用户手指去拖动其内部的某个View,针对具体的需要去写好onInterceptTouchEvent和onTouchEvent这两个方法是一件很不容易的事,需要自己去处理很多事情。
好在官方在v4的支持包中提供了ViewDragHelper,帮忙我们方便编写自定义ViewGroup。
2 、ViewDragHelper的使用
2.1、自定义ViewGroup
public class VerticalDragListView extends FrameLayout {
private ViewDragHelper mViewDragHelper;
public VerticalDragListView(@NonNull Context context) {
this(context, null);
}
public VerticalDragListView(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public VerticalDragListView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
/**
* 创建实例需要3个参数,第一个就是当前的ViewGroup,
* 第二个sensitivity,
* 第三个参数就是Callback,在用户的触摸过程中会回调相关方法
*/
mViewDragHelper = ViewDragHelper.create(this, 1.0f,mDragCallback);
}
ViewDragHelper.Callback mDragCallback = new ViewDragHelper.Callback() {
@Override
public boolean tryCaptureView(@NonNull View child, int pointerId) {
return true;
}
@Override
public int clampViewPositionVertical(@NonNull View child, int top, int dy) {
return top;
}
@Override
public int clampViewPositionHorizontal(@NonNull View child, int left, int dx) {
return left;
}
};
@Override
public boolean onTouchEvent(MotionEvent event) {
mViewDragHelper.processTouchEvent(event);
return true;
}
}
2.1.1、 ViewDragHelper的实例化
/**
* 创建实例需要3个参数,第一个就是当前的ViewGroup,
* 第二个sensitivity,
* 第三个参数就是Callback,在用户的触摸过程中会回调相关方法
*/
mViewDragHelper = ViewDragHelper.create(this, 1.0f,mDragCallback);
2.1.2 、实现ViewDragHelper.CallCack相关方法
ViewDragHelper.Callback mDragCallback = new ViewDragHelper.Callback() {
@Override
public boolean tryCaptureView(@NonNull View child, int pointerId) {
// 指定该子View是否可以拖动,就是 child
return true;
}
@Override
public int clampViewPositionVertical(@NonNull View child, int top, int dy) {
//垂直方向拖动的位置
return top;
}
@Override
public int clampViewPositionHorizontal(@NonNull View child, int left, int dx) {
//水平方向拖动的位置
return left;
}
};
2.1.3 、触摸相关方法
@Override
public boolean onTouchEvent(MotionEvent event) {
//触摸事件丢给ViewDragHelper处理
mViewDragHelper.processTouchEvent(event);
return true;
}
2.2、 布局文件
<?xml version="1.0" encoding="utf-8"?>
<com.zsj.verticaldraglistview.VerticalDragListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.zsj.verticaldraglistview.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:text="后面"
android:background="@color/colorPrimaryDark"
android:gravity="center"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@color/colorAccent"
android:text="前面"
android:gravity="center"
/>
</com.zsj.verticaldraglistview.VerticalDragListView>