Android 基础知识按键篇--------------触摸和按键

Android 下常见的几个触摸事件


(1).dispatchTouchEvent 主要进行事件的分发和处理,当返回true时自己处理,自己消费,事件消失,当返回false时,回溯给父view的onTouchEvent,,是触摸事件要执行的第一个方法,后续的方法要不要执行,都取决于他。

(2).onInterceptTouchEvent 用来做触摸事件的拦截,默认返回false,若果返回false或者super,则事件继续传递,经过的每一层的viewGroup都会去询问是否拦截,若果返回true,则事件不再向下传递给子view,执行自己的onTouchEvent方法后续的move up都在onTouchEvent中执行,不再询问,事件被拦截以后,子view会接收到一个cancel事件,恢复之前的状态,结束事件流。

(3).requestDisallowInterceptTouchEvent 也是用来做事件拦截的,是viewGroup的专有方法,不过一般是在子view中调用的,一但子view调用的话,父view以及上一级父view,不再拦截该事件,事件的接管和拦截有子view控制。


(4).onTouch 当事件被分发到子view的时候,该方法就会被调用,在onTouchEvent方法之前被调用。

(5).onTouchEvent 真正用来处理触摸事件的最后的方法,可以在这里可以写自己的算法和逻辑。

(6).onclick 点击事件,触摸事件的一个内容,在onTouchEvent的UP事件里执行。
(7).onTouch onTouchEvent onClick 三个方法的执行顺序,是 onTouch-> onTouchEvent-> onClick  onClick会消费掉事件,不会再向上回溯。

Android触摸事件分发机制图

 

Android 基础知识按键篇--------------触摸和按键_第1张图片

(图片来源于网络,侵权立删)

有关触摸事件的总结

1.
dispatchTouchEvent返回false和true对于Activity来说都是一样,因为他是最顶层的事件接收者,而ViewGroup和View返回super则是向下传递,返回false就是向父控件的onTouchEvent回溯事件。

2.
onTouchEvent返回super代表向上回溯事件,返回false则代表自己不处理,所以也是向上回溯事件,如果最终都没消费,则Activity消费,事件消失。

3.
所有方法的super就是默认返回值,就是保证让整个事件流按照U型图走完

onInterceptTouchEvent默认返回super,通过源码我们知道其实就是返回false,默认是不去拦截事件的,这也符合常理,可以让子view有机会去捕获事件,返回true则代表拦截了这个事件,交给自己的onTouchEvent去处理,ViewGroup的dispatchTouchEvent的super默认实现就是调用自己的onInterceptTouchEvent,这也就可以保证事件有机会分发到自己的onTouchEvent

4.
dispatchTouchEvent和onTouchEvent都是以Down事件为基准,来判断后续事件是否经过自己,也就是自己消费,如果Down事件返回了false或者super,则后续事件都不再经过自己了,包括move,up,如只有返回true的时候,后续事件才会经过自己

Activity  ViewGroup View的基本关系图

 

Android 基础知识按键篇--------------触摸和按键_第2张图片

 

Android下常见的几个按键事件:

处理物理按键的回调方法:
(1).onKeyDown()该方法是接口KeyEvent.CallBack中的抽象方法,所有的view都实现了该方法并重写了该方法,该方法用来捕捉手机键盘被按下的事件,通过KeyCode来区别不同的按键,返回true表示该方法已经被执行,事件已经被处理,返回false则表示要有其他的view来处理。
(2).onKeyUp()按键松开后触发,默认不会执行任何操作,返回值为false,

(3). onKeyLongPress()  activity和view中均有此方法,但是重载该方法后并不能对该方法做出响应,原因是onKeyDown()中没有对长按还是短按做出处理,一般加如下判断,才可以, 
if (event.getRepeatCount() == 0) {
          event.startTracking();
            isLongPressKey = false;
      }else{
               isLongPressKey = true;
      }
此外要注意在onKeyUp()方法中也要做相应的判断。


 

你可能感兴趣的:(Android学习总结)