举个栗子说下Android事件分发

面试官为什么老问:Android事件分发机制?
通俗的说,就是当用户触摸屏幕时,这个事件传递的一个过程!
事件传递的原理又是什么呢?
这个事件传递原理就是责任链机制,OkHttp的核心原理也是用的责任链模式
简单的介绍下责任链模式:就是多个对象都有机会处理处理一个请求,并将这些对象连成一条链,沿着这条链处理传递事件,直到有对象处理传递事件为止。
举个栗子

产品狗——>CTO——>部门组长——>小开发仔
产品提了一个需求,CTO开始吩咐组长,组长就交给开发
这么一个链就行成了,需求,对象有了
过程应该会有这么几个情况
一个情况就是:开发看到这个需求觉得so Esay,分分钟搞定,反馈给组长,组长反馈给CTO然后这个需求就解决了!
第二个情况就是:开发看到这个需求懵逼了,卧槽做不了,反馈给组长,组长反馈给CTO,然后CTO就把这个需求给处理了.
第三个情况:CTO觉得可做,把这个需求吩咐给组长,组长分发下去给Pro,Pro解决不了,返回给组长,组件一看可以做,自己就把处理了,反馈给CTO
第四个情况:CTO觉得可做,把这个需求吩咐给组长,组长为了照顾小开发们,自己解决了,反馈给CTO
第五个情况:CTO看到这个需求,觉得这个需求很傻逼直接给拦截处理了.

事件分发是有哪些对象连成一条链呢?
ViewGroup:组件群
dispatchTouchEvent():事件分发方法
onInterceptTouchEvent ():事件拦截
onTouchEvent():事件处理
View:小组件
dispatchTouchEvent():事件分发方法
onTouchEvent():事件处理

用代码还原场景

CTO

public class CTOView extends LinearLayout{

    public CTOView(Context context) {
        super(context);
    }
    public CTOView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public CTOView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        Log.d("zouxj----->","CTOView dispatchTouchEvent");
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        Log.d("zouxj----->","CTOView onInterceptTouchEvent");
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("zouxj----->","CTOView onTouchEvent");
        return super.onTouchEvent(event);
    }
}

组长

public class TeamLeaderView extends LinearLayout {
    public TeamLeaderView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public TeamLeaderView(Context context) {
        super(context);
    }

    public TeamLeaderView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        Log.d("zouxj----->","TeamLeaderView dispatchTouchEvent");
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        Log.d("zouxj----->","TeamLeaderView onInterceptTouchEvent");
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("zouxj----->","TeamLeaderView onTouchEvent");
        return super.onTouchEvent(event);
    }
}

开发仔

public class ProGrammerView extends View {
    public ProGrammerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    public ProGrammerView(Context context) {
        super(context);

    }

    public ProGrammerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.d("zouxj---->", "ProGrammerView dispatchTouchEvent");
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("zouxj---->", "ProGrammerView onTouchEvent ");
        return super.onTouchEvent(event);
    }

}
image.png

点击Pro比如一个需求
情况一:CTO得到一个需求,onInterceptTouchEvent()没有拦截,所以dispatchTouchEvent()分发给Leader,它也做了同样的事onInterceptTouchEvent()没有拦截,所以dispatchTouchEvent()分发给了Pro


image.png

情况二:Pro对这个需求做不了,把 onTouchEvent(MotionEvent event)=false

image.png

情况三:Pro对这个需求做不了,Leader把这个事情处理了onTouchEvent(MotionEvent event)=true,不需要CTO自己处理
image.png

情况四:组长接到需求不分发下去,onInterceptTouchEvent(MotionEvent ev)=false,这时没有Pro什么事了
image.png

情况五,CTO觉得这个需求不科学 onInterceptTouchEvent(MotionEvent ev)=true,不分发下去了,自己去和产品重新商量,所以没有后面的组长和开发什么事了
image.png

以上就是对于栗子的还原

总结:

以上给小白看到,高手忽略即可!

在传递流程和处理流程中,你都可以修改方法的返回值,来对流程做控制。
如下: 对于事件的拦截,我们主要重写就是OnInterceptTouchEvent和onTouchEvent方法。

1.事件的传递,返回结果为true,表示拦截,不再往下传递,为false,不拦截,继续往下传递。主要针对的就是OnInterceptTouchEvent方法。

2.事件的处理,返回结果为true,表示拦截,不再往上传递(即我处理的很完美,不需要你再来审核我!),返回结果为false(没有成功处理事件),继续向上传递。 针对就是onTouchEvent方法。

CTO——onInterceptTouchEvent()&dispatchTouchEvent()—>Leader
—onInterceptTouchEvent()&dispatchTouchEvent()——>Pro
—onTouchEvent()——>Leader——onTouchEvent()——>CTO
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容