安卓Tv开发(二)焦点控制(键盘事件)
上篇文章中说道了触控事件,但是只对MotionEvent做了细说,很多东西还是不懂怎么用触控事件,现在就做对上篇的补充吧
在view重写onTouchEvent方法,通过event.getAction()对不同的enent就可以处理了,代码如下
- public boolean onTouchEvent(MotionEvent event)
- {
- int events[] = {MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE,
- MotionEvent.ACTION_UP, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_OUTSIDE,
- MotionEvent.ACTION_POINTER_DOWN,MotionEvent.ACTION_POINTER_UP,
- MotionEvent.EDGE_TOP,MotionEvent.EDGE_BOTTOM,MotionEvent.EDGE_LEFT,MotionEvent.EDGE_RIGHT};
- String szEvents[]={"ACTION_DOWN", "ACTION_MOVE",
- "ACTION_UP", "ACTION_MOVE", "ACTION_CANCEL", "ACTION_OUTSIDE",
- "ACTION_POINTER_DOWN","ACTION_POINTER_UP",
- "EDGE_TOP","EDGE_BOTTOM","EDGE_LEFT","EDGE_RIGHT"};
- for(int i=0; i < events.length; i++)
- {
- if(events[i] == event.getAction())
- {
- if(oldevent != event.getAction())
- {
- DisplayEventType(szEvents[i]);
- oldevent = event.getAction();
- }
- break;
- }
- }
- return super.onTouchEvent(event);
- }
KeyEvent事件对象
KeyEvent.KEYCODE_DPAD_DOWN; 下
KeyEvent.KEYCODE_DPAD_LEFT;左
KeyEvent.KEYCODE_DPAD_RIGHT;右
KeyEvent.KEYCODE_DPAD_CENTER;确定键
KeyEvent.KEYCODE_HOME;房子键
public boolean onKeyDown(int keyCode,KeyEvent event) { switch(keyCode) { case KeyEvent.KEYCODE_0: DisplayToast("你按下数字键0"); break; case KeyEvent.KEYCODE_DPAD_CENTER: DisplayToast("你按下中间键"); break;sss case KeyEvent.KEYCODE_DPAD_DOWN: DisplayToast("你按下下方向键"); break; case KeyEvent.KEYCODE_DPAD_LEFT: DisplayToast("你按下左方向键"); break; case KeyEvent.KEYCODE_DPAD_RIGHT: DisplayToast("你按下右方向键"); break; case KeyEvent.KEYCODE_DPAD_UP: DisplayToast("你按下上方向键"); break; case KeyEvent.KEYCODE_ALT_LEFT: DisplayToast("你按下组合键alt+←"); break; } return super.onKeyDown(keyCode, event); }
在了解这个时间之前,先熟悉下dispatchkeyevent和onkeydown和onkeyup的关系 当键盘按下时
首先触发dispatchKeyEvent
然后触发onUserInteraction 再次onKeyDown 如果按下紧接着松开,则是俩步
紧跟着触发dispatchKeyEvent 然后触发onUserInteraction 再次onKeyUp
当我们重写了onKeyDown方法后,如果return false,则会继续调用系统的onKeyDown方法。如果只想让程序调用自己写的onKeyDown,则需要return true。了解关系后就看鼠标模拟事件。我们重写dispatchKeyEvent,之后就可以做相应操作,
备注:TVConstants属于个人封装的类,对应keyevent的相应类型。
<span style="font-size:14px;">@Override public boolean dispatchKeyEvent(KeyEvent event) { switch(event.getKeyCode()){ case TVConstants.KEYCODE_UP: case TVConstants.KEYCODE_DOWN: case TVConstants.KEYCODE_LEFT: case TVConstants.KEYCODE_RIGHT: case TVConstants.KEYCODE_CENTER: default: break; } return super.dispatchKeyEvent(event); } </span>三 instrumentation
instrumentation发送键盘鼠标事件:Instrumentation提供了丰富的以send开头的函数接口来实现模拟键盘鼠标,如下所述:
sendCharacterSync(int keyCode) //用于发送指定KeyCode的按键
sendKeyDownUpSync(int key) //用于发送指定KeyCode的按键
sendPointerSync(MotionEvent event) //用于模拟Touch
sendStringSync(String text) //用于发送字符串
Instrumentation inst=new Instrumentation();
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 10, 10, 0));
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 10, 10, 0));
类似peddingIntent的用法,这样我们自己绘制一个鼠标,在里面相应代码处理相应逻辑就可以具体实现代码之后将会发布。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。