触摸按键
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触摸事件分发机制图
(图片来源于网络,侵权立删)
有关触摸事件的总结
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下常见的几个按键事件:
处理物理按键的回调方法:
(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()方法中也要做相应的判断。
相关阅读
LinkedME|Android移动开发者不得不知道的技术 Deep Lin
1.概述 Deep Linking(译:深度链接)作为移动开发者可能对这个概念有点陌生,但是对于它的实现原理,说出来大家肯定都知道。不过我们先说
什么是Android SDK Android SDK(Software Development Kit,软件开发工具包)被软件开发工程师用于为特定的软件包、软件框架、硬
Android组件管理框架—后台服务Service之bindService
一 前言 通过startservice来启动一个service,通常该service是无法返回结果的(这也是与bindservice的区别之一),服务开启, 这个服务
Android获取应用签名(开发版SHA1和发布版SHA1)
当我们需要接入百度地图等一系列需要开发版SHA1和发布版SHA1才能创建完成应用的时候,如果找不到开发版SHA1和发布版SHA1是不是很苦
是当控件被按下的时候控件的表示,可以实现按下按钮时,按钮变成领一个模样,松开之后又恢复原样。类似的还有:android:state_focused是