这下其实也不难,以前学触摸事件时也知道怎么解决的,但是时间久了也会忘,所以这里记录一下,方便以后复习,核心代码如下:
private var downX = 0f
private var downY = 0f
private var hasMove = false
override fun onTouchEvent(event: MotionEvent): Boolean {
processEventConflict(event)
// TODO 做具体的滑动控件的工作
return super.onTouchEvent(event)
}
/** 处理事件突然 */
private fun processEventConflict(event: MotionEvent) {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
downX = event.x
downX = event.y
hasMove = false
isPressed = true // 系统属性,修改按下状态
}
MotionEvent.ACTION_MOVE -> {
hasMove = true
if (downX == 0f && downY == 0f) {
downX = event.x
downX = event.y
hasMove = false
}
// 获取滑动的最小距离,因为如果小于这个距离可能是误操作
val touchSlop = ViewConfiguration.get(context).scaledTouchSlop
// 计算水平和垂直的移动距离。因为移动距离有负数的,所以要用绝对值
val horizontalMove = abs(event.x - downX)
val verticalMove = abs(event.y - downY)
// 如果用户处于滑动状态了,并且水平滑动的距离比垂直的大,则请求父View不要拦截touch事件
if ((horizontalMove >= touchSlop || verticalMove >= touchSlop)
&& horizontalMove > verticalMove) {
parent.requestDisallowInterceptTouchEvent(true)
}
}
MotionEvent.ACTION_UP -> {
isPressed = false // 系统属性,修改按下状态
if (!hasMove) {
performClick()
}
hasMove = false
/* 因为有时候收不到ACTION_DOWN事件,但是能收到移动事件,所以这里
在抬起时清空一下数据,方便在移动时判断是否有收到ActionDown事件 */
downX = 0f
downY = 0f
}
### 最后
文章所有资料全部已经打包整理好,另外小编手头上整理了大量Android架构师全套学习资料,**Android核心高级技术PDF文档+全套高级学习资料+视频+2021 BAT 大厂面试真题解析**
**资料展示:**
![image](https://uploa
![](https://img-blog.csdnimg.cn/img_convert/51c49505527a71230dc1ebce9097bb6d.jpeg)
d-images.jianshu.io/upload_images/24596414-01c3e14e8e5a07fc?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image](https://img-blog.csdnimg.cn/img_convert/6e1c80b1a9f9d51ee7ea2116d55dbce7.webp?x-oss-process=image/format,png)
![image](https://img-blog.csdnimg.cn/img_convert/d26853714e6f9111498e4b44325714a0.webp?x-oss-process=image/format,png)
![image](https://img-blog.csdnimg.cn/img_convert/7e4aee2a8ff1d7500dadc68847b7f6b7.webp?x-oss-process=image/format,png)
链图片转存中...(img-4Hoisp2c-1716043070748)]
[外链图片转存中...(img-tNbUlf89-1716043070748)]
[外链图片转存中...(img-Q5M3CZrI-1716043070749)]