Android触摸事件部分细节

这下其实也不难,以前学触摸事件时也知道怎么解决的,但是时间久了也会忘,所以这里记录一下,方便以后复习,核心代码如下:


	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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值