標籤:android style blog color os io 使用 div cti
最近做android電視系統定製,上面安排我做一個按鍵板按鍵複用的功能:當電視的OSD菜單顯示出來時按鍵板上的 ch+/ch- 複用為方向鍵上/下,vol+/vol- 複用為方向鍵 右/左。 OSD 菜單是使用一個Fragment實現,所以選擇在 OSD 菜單顯示(onResume)觸發按鍵複用功能,在 OSD 菜單消失(onStop)時取消按鍵複用功能。實現的思路是合理的了,我們知道應用程式處理按鍵事件 KeyEvnet 通常是通過事件的keyCode值決定程式要做什麼事,所以只需在處理按鍵函數 onKey,onKeyUp,onKeyDown 等處理按鍵事件前修改事件的keyCode值就可以實現按鍵的複用了,具體到這裡就是把 KEYCODE_CHANNEL_UP/KEYCODE_CHANNEL_DOWN 改為 KEYCODE_DPAD_UP/KEYCODE_DPAD_DOWN 同樣的把 KEYCODE_VOLUME_UP/KEYCODE_VOLUME_DOWN 改為 KEYCODE_DPAD_RIGHT/KEYCODE_DPAD_LEFT。 要在上面提到的函數前修改索引值就需要用到 dispatchKeyEvent(KeyEvent event) 了,官方對該方法的解釋是在按鍵事件被分發到視窗前將其攔截。好了閑話少說代碼如下:
1 public boolean dispatchKeyEvent(KeyEvent event) { 2 long downTime= event.getDownTime(); 3 long eventTime = event.getEventTime(); 4 int action = event.getAction(); 5 int code = event.getKeyCode(); 6 int repeat = event.getRepeatCount(); 7 int metaState = event.getMetaState(); 8 switch (code) { 9 case KeyEvent.KEYCODE_CHANNEL_UP:10 event = new KeyEvent(downTime, eventTime, action, KeyEvent.KEYCODE_DPAD_UP, repeat, metaState);11 break;12 case KeyEvent.KEYCODE_CHANNEL_DOWN:13 event = new KeyEvent(downTime, eventTime, action, KeyEvent.KEYCODE_DPAD_DOWN, repeat, metaState);14 break;15 case KeyEvent.KEYCODE_VOLUME_UP:16 event = new KeyEvent(downTime, eventTime, action, KeyEvent.KEYCODE_DPAD_RIGHT, repeat, metaState);17 break;18 case KeyEvent.KEYCODE_VOLUME_DOWN:19 event = new KeyEvent(downTime, eventTime, action, KeyEvent.KEYCODE_DPAD_LEFT, repeat, metaState);20 break;21 }22 23 return super.dispatchKeyEvent(event);24 }
android按鍵複用