学会了Android事件分发可以甩锅?

这篇文章讲述了作者作为程序员如何系统性地记录和整理编程知识,重点介绍了事件处理(如触摸、按键和轨迹球)、事件类型(ACTION_DOWN, ACTION_MOVE, ACTION_UP等)、事件传递路径,以及在Activity中处理触摸事件冲突的方法,包括ViewPage、Fragment和ScrollView的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“生命周而复始又乏味之至,而只有当你觉得它可爱时,它才会变得可爱如斯。”

时隔四季,我重新开始了我的文章更新,so do you miss me?
在这里插入图片描述

前言

从工作到现在,我是个三年的程序员了,但是觉得自己掌握的知识很碎片化。所以决定把我学到的知识点,系统性的归纳和记录,所以CSDN,爷回来了。
在这里插入图片描述
错了,是干净的爷回来了。
在这里插入图片描述

1.事件是啥

在这里插入图片描述
听我慢慢道来。
触摸,按键,轨迹球啥的都是事件。(通常第一种,第二种不多用,第三种很不常见,了解就行)
如果不知道轨迹球是个啥的话,可以链接了解一下:罗技M570轨迹球鼠标

2.事件类型

思考下等下说给你听。
在这里插入图片描述
触摸事件类型,MotionEvent典型的三个事件:
ACTION_DOWN、ACTION_MOVE、ACTION_UP(当然还有个ACTION_CANCEL)
ACTION_DOWN:点击
ACTION_MOVE:没抬起在滑动
ACTION_UP:抬起
ACTION_CANCEL:事件异常

3.事件传递

上面的事件类型都会走到Activity的dispatchTouchEvent方法。
Activity–>Window–>DecorView–>子元素(ViewGroup–>ViewGroup–>View)
直接上图Activity、ViewGroup和View的如下:
在这里插入图片描述

3.1看图总结:(还是很重要的,主要是可以凸显你的NB之处)
  1. 只有ViewGroup中有onInterceptTouchEvent方法。
  2. 全程无拦截super的话流程是呈现u型的。(也就是正常的无拦截流程)
  3. diapatchTouchEvent和onTouchEvent方法这两方法只要返回true都是直接消费事件不在传递事件。
  4. onInterceptTouchEvent方法返回true的话是自己处理其他情况都是传递下一级处理。
  5. 这种处理模式很像拦截器模式,也叫责任链模式。(给下一个处理问题,算甩锅不,学会?)
    在这里插入图片描述

4.解决冲突

在这里插入图片描述

1.冲突ViewPage+Fragment(ListView)的左右上下冲突被ViewPage自己处理了。(我们大多数不需要去调整)
2.只有ScrollView和ListView有冲突了,但是编译器会直接提示出来,要你更换参数,合理调整。
3.自定义视图,用如下两种方法去解决,在子视图也依然能够滑动的,具体的冲突和业务效果你需要自己去考虑编码了。

//外部拦截法,在父视图重写它的onInterceptTouchEvent
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    boolean intercepted = false;
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_UP:
            intercepted = false;
            break;
        case MotionEvent.ACTION_MOVE:
            intercepted = true;
            break;
    }
    return intercepted;
}
//内部拦截法,在子视图重写它的dispatchTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            getParent().requestDisallowInterceptTouchEvent(true);
            break;
        case MotionEvent.ACTION_MOVE:
            getParent().requestDisallowInterceptTouchEvent(false);
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return super.dispatchTouchEvent(ev);
}

4.错误不足

请大佬私信指出。(心里默念,我是没错的)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值