view的事件分发

事件MotionEvent常见类型:ACTION_DOWN、ACTION_MOVE、ACTION_UP

事件分发相关函数:dispatchTouchEvent、nInterceptTouchEvent、onTouchEvent

onTouchListener(onTouch)、onClickListener(onClick)

事件传递顺序:Activity--ViewGroup--View

(其实Activity和ViewGroup中还有Window,Window的唯一实现是PhoneWindow,事件会传递到顶级View即DecorView中,DecorView继承自FrameLayout,是个Viewgroup)



流程

1、Activity:

1、dispatchTouchEvent:

返回值,return

1、super.dispatchTouchEvent(ev):事件向下传递,调用ViewGroup或View的dispatchTouchEvent

注意,理解好这个向下传递,如果事件点击在子ViewGroup或View所在的区间,那么

向下传递,就是传到它们的dispatchTouchEvent,否则向下传递就是传到自身的

onTouchEvent,下面的ViewGroup的向下传递原理类似

2、true:事件消费,传递终止

3、false:事件不消费,向下传递终止,是否有向上传递?

2、onTouchEvent:

1、super.onTouchEvent(event):不知道默认是否消费事件,但这是最上层的onTouchEvent,之后的事件会直接传递到此函数

2、true:消费事件,之后的事件会直接传递到此函数

3、false:不消费事件,之后的事件依然会直接传递到此函数

注意,这个函数只有在以下三种情况下才会调用,而且调用过一次后,后面的事件经过Acivity的dispatchTouchEvent后,

就会直接调用这个函数,不再进行向下传递

1、下一级的ViewGroup或View的dispatchTouchEvent函数返回false

2、下一级的ViewGroup或View的onTouchEvent函数返回false

3、下一级的ViewGroup函数返回super.onTouchEvent(event)

2、ViewGroup:

1、dispatchTouchEvent:

1、super.dispatchTouchEvent(ev):事件向下传递,调用ViewGroup的onInterceptTouchEvent

2、true:事件消费,终止传递

3、false:事件不消费,终止向下传递,向上传递,调用Activity的onTouchEvent

2、onInterceptTouchEvent:

1、super.onInterceptTouchEvent(ev):事件向下传递,调用View的dispatchTouchEvent

纠正,会看情况是否向下传递,比如下面的网址说的情况,这个返回值就不向下传递

那就是true,

https://zhidao.baidu.com/question/981857480840100339.html?skiptype=2

2、true:事件拦截,调用ViewGroup的onTouchEvent

3、false:事件不拦截,向下传递,调用View的dispatchTouchEvent,这里等同于super.onInterceptTouchEvent(ev)?

看上面的纠正,super.onInterceptTouchEvent(ev)不一定返回false,视情况而定,比如上面网址的例子就不向下传递

3、onTouchEvent:

1、super.onTouchEvent(event):默认是事件不消费?调用Activity的onTouchEvent,之后的事件不会再传递到ViewGroup进行处理

注意里与View的这一返回值进行区别,View的这一返回值一般默认是消费的,而ViewGroup的这一

返回值一般默认是不消费的,也很好理解

2、true:事件消费,终止传递,之后的事件会Activity--ViewGroup

注意,之后的事件既不会再向下传递,即不会再传递到View,也不会再调用ViewGroup的onInterceptTouchEvent

3、false:事件不消费,向上传递,调用Activity的onTouchEvent,之后的事件不会再传递到ViewGroup进行处理

注意,这个函数在以下三种情况下才会调用,而且调用过一次后,之后的事件不再向下传递,也不会再调用ViewGroup的onInterceptTouchEvent

1、ViewGroup的onInterceptTouchEvent返回true

2、View的dispatchTouchEvent返回false

3、View的onTouchEvent返回false

3、View:

1、dispatchTouchEvent:

1、super.dispatchTouchEvent(ev):事件向下传递,调用View的onTouchEvent,之后的事件还会依次Activity--ViewGroup--View

2、true:事件消费,终止传递,之后的事件还会依次Activity--ViewGroup--View

3、false:事件不消费,终止向下传递,向上传递,调用ViewGroup的onTouchEvent,之后的事件不会再传递到View进行处理

2、onTouchEvent:

1、super.onTouchEvent(event):默认是事件消费?之后的事件还会依次Activity--ViewGroup--View

比如继承一个Button,一般像Button这样带点击功能的View的onTouchEvent都会

消费掉事件

2、true:事件消费,之后的事件还会依次Activity--ViewGroup--View

3、false:事件不消费,向上传递,调用ViewGroup的onTouchEvent,之后的事件不会再传递到View进行处理

注意,这个函数在以下一种情况下才会调用,

1、View的dispatchTouchEvent函数返回super.dispatchTouchEvent(ev)

额外的两个函数

1、onTouch:

1、在哪调用

在定义ViewGroup或View变量的Activity或Fragment中调用

testLinearLayout或testButton

.setOnTouchListener(new View.OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

Log.i(SjffActivity.TAT, "TestButton-onTouch-ACTION_DOWN...");

break;

case MotionEvent.ACTION_UP:

Log.i(SjffActivity.TAT, "TestButton-onTouch-ACTION_UP...");

break;

default:

break;

}

return false;

}

});

2、什么时候被调用

一定是在上述流程中,ViewGroup或View的onTouchEvent函数被调用的情况下,相应的onTouch函数才能被调用,

而且,onTouch函数先于onTouchEvent函数被调用,注意onTouch函数被调用情况下,onTouchEvent函数不一定能被调用

3、返回值

1、false:则onTouchEvent函数接着会被调用,

2、true:则onTouchEvent函数不会被调用

2、onClick

1、在哪调用

在定义ViewGroup或View变量的Activity或Fragment中调用

testLinearLayout或testButton

.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Log.i(SjffActivity.TAT, "TestButton---onClick...");

}

});

2、什么时候被调用

一定是在上述流程中,ViewGroup或View的onTouchEvent函数被调用的情况下,相应的onClick函数才能被调用,

而且,onClick函数后于onTouchEvent函数被调用,注意onClick函数被调用情况下,onTouchEvent函数一定先被调用了

注意,onClick函数是在ACTION_UP事件后才被调用,即手指抬起的时候才被调用,与onTouch的事件监听不同

3、返回值

onClick本身没有返回值,但是一旦testLinearLayout或testButton设置了.setOnClickListener,

则相应的onTouchEvent函数就会返回true,即消费了事件

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

推荐阅读更多精彩内容