前言
ViewDragHelper需要自定义ViewGroup实现,并且只是针对ViewGroup里的子View进行拖放,在拖放的过程中不能携带数据。也不能跨进程,甚至不能跨activity。所以ViewDragHelper本质上更像是一个ViewGroup里简单实现拖放效果的帮助类。
一个简单拖动的例子
快速了解一下,有个概念
效果图
代码
自定义ViewGroup布局
class MyViewDragConstraintLayout(context: Context, attrs: AttributeSet?) : ConstraintLayout(context, attrs) {
private lateinit var mViewDragHelper: ViewDragHelper
init {
/**
* 第一个参数是实现拖动的ViewGroup父类布局,第二个参数是拖动时的灵敏度,拖动开始的敏感程度的乘数。值越大越敏感。1.0f是正常的。
*/
mViewDragHelper = ViewDragHelper.create(this, 1.0f, object : ViewDragHelper.Callback() {
/**
* 是否允许view的拖动功能,返回true是允许拖动,返回false是不允许拖动
*/
override fun tryCaptureView(child: View, pointerId: Int): Boolean {
return true
}
/**
* 控制垂直方向的拖动位移,如果不重写此方法默认是不允许垂直运动的,按照下面重写方法后可以允许垂直方向的拖动
*/
override fun clampViewPositionVertical(child: View, top: Int, dy: Int): Int {
return top
}
/**
* 控制横向方向的拖动位移,如果不重写此方法默认是不允许横向运动的,按照下面重写方法后可以允许横向方向的拖动
*/
override fun clampViewPositionHorizontal(child: View, left: Int, dx: Int): Int {
return left
}
})
}
/**
* 注意,你需要重写onInterceptTouchEvent方法并且将触摸拦截交予ViewDragHelper的shouldInterceptTouchEvent,使其可以重新分配触控事件
*/
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
return mViewDragHelper.shouldInterceptTouchEvent(ev)
}
/**
* 注意,你需要重写onTouchEvent,并且将mViewDragHelper的processTouchEvent实现,使其可以实现拖动子view的效果
*/
override fun onTouchEvent(event: MotionEvent): Boolean {
mViewDragHelper.processTouchEvent(event)
return true
}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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=".MainActivity">
<com.lwlx.mydragtestapp.MyViewDragConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/icon1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</com.lwlx.mydragtestapp.MyViewDragConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
end
标签:return,拖动,ViewDragHelper,Int,讲解,override,Android,重写 From: https://www.cnblogs.com/guanxinjing/p/17463237.html