介绍
dispatchKeyEvent什么时候调用?在用遥控器按键操控投影时
KeyEvent的分发是从Activity->ViewGroup->View
ViewGroup的dispatchKeyEvent和View的dispatchKeyEvent一样,都在找处理KeyEvent事件的相关责任人。不同的是ViewGroup找的是那个focused的View,如果找到了,它就会说:“嘿,兄弟,KeyEvent就交给你了。“,然后就拍拍屁股走人了;View找的则是注册过的Listener们,它会说:”把你们的回调函数都拿出来耍耍吧!” dispatch有派遣发送的意思,dispatchKeyEvent所做的事实际上是告诉View上注册过的Listener们,有个KeyEvent来了,请相关责任人(如OnKeyListener,OnClickListener等)出来处理一下吧。
KeyEvent
KeyEvent的组成
KeyEvent的主要包含两个部分:Action和KeyCode(键值)
- Action:ACTION_DOWN或者ACTION_UP,代表是按下或者抬起
- KeyCode:比如数字键、确定键等
KeyCode常用值
KeyEvent.KEYCODE_DPAD_RIGHT
KeyEvent.KEYCODE_DPAD_LEFT
KEYCODE_DPAD_UP
KEYCODE_DPAD_DOWN
KeyEvent常用方法
getAction() // 获取action的值判断是按下和抬起
getKeyCode()//获取按键的键值
getRepeatCount()//获取event重复的数量
getRepeatCode()只会在ACTION为ACTION_DOWN时有意义,就是按下,值为0代表第一次按,
其他值计算时间可以认为是长按,也就是像下面一样:
第一次event.getRepeatCount()返回0;
第二次event.getRepeatCount()返回1;
按键判重或者长按只处理一次事件 可以用该方法:
public boolean dispatchKeyEvent(KeyEvent event) {
//点击后退键的时候,为了防止点得过快,触发两次后退事件,故做此设置
if(mkeyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0){
//Your code here
return true; //表示已经处理,系统不会处理此事件
}
return super.dispatchKeyEvent(event);//表示由系统处理
}
KeyEvent事件序列
一个KeyEvent的触发的Action的序列是 ACTION_DOWN…ACTION_DOWN…ACTION_UP
从ACTION_DOWN开始然后可能有多个ACTION_DOWN(长按时)和一个ACTION_UP(抬起)