日更挑战-安卓开发之触摸事件传递机制(被坑版)

2021-05-18  本文已影响0人  愿你我皆是黑马

越不懂的越爱装
大家都同等:IT世界没有难不难,只有是否了解过

挑战目录

。。。。

简书个坑逼,我写了这么久的直接就给我保存的是几个小时前的历史版本,再也不敢用在线编辑器了

什么是触摸事件?

安卓中事件分类如下几种:

1. ACTION_DOWN:手指初次接触到屏幕时触发。
2. ACTION_MOVE:手指在屏幕上滑动时触发(会多次触发)
3. ACTION_UP:手指离开屏幕时触发
4. ACTION_CANCEL:事件被上层拦截时触发

事件如何传递?

事件传递分为 感应到事件,事件分发,事件拦截,事件处理等几个方面

感应到事件?

待了解。。。

会调用Activity中的dispatchTouchEvent方法。


事件分发?

事件分发通过dispatchTouchEvent方法,Activity,View,ViewGroup都有这个方法。
1.在Activity中的dispatchTouchEvent
主要用来将事件给ViewGroup分发,最终如果没有被处理,则调用自己的处理。
public boolean dispatchTouchEvent(MotionEvent ev) {
    //当ACTION_DOWN事件(还有Key,Trackball事件)时,调用Activity.onUserInteraction():
    //可以override该方法得知用户正在与设备交互。
    //对于有一个onUserLeaveHint方法,自动在onPause调用之前(具体不管,这事件无关)
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        onUserInteraction();
    }

    //调用Activity包含的根视图的dispatchTouchEvent()
    if (getWindow().superDispatchTouchEvent(ev)) {
        return true;
    }
    // 如果superDispatchTouchEvent()返回false
    //都没有拦截该事件的话,则调用Activity的onTouchEvent()
    return onTouchEvent(ev);
}
2.在ViewGroup中的dispatchTouchEvent
ViewGroup有多个子View,这里的dispatchTouchEvent的作用是找到合适的View处理该事件


3.在View中的dispatchTouchEvent (可以说成是View调用处理事件方法的判断)
View没有子View所以他的dispatchTouchEvent的作用为:分发给某个方法处理当前事件。






事件拦截?


事件处理?

事件处理通过onTouchEvent和setOnTouchListener方法里面传递的回调参数的onTouch方法。Activity,View,ViewGroup都有这两个方法。

1.在Activity中的onTouchEvent和onTouch
2.在View中的onTouchEvent和onTouch
3.在ViewGroup中的onTouchEvent和onTouch
PS:对于onClick事件

流程

1. Down事件流程
2. Move事件流程
3. Up事件流程

为什么会有事件冲突

事件冲突如何解决

谷歌对特殊控件事件分发的处理

源码解析

1. superDispatchTouchEvent
2. onUserInteraction
3. dispatchTouchEvent
4. onInterceptTouchEvent
5. onTouchEvent
6. onClick
上一篇下一篇

猜你喜欢

热点阅读