安卓Tv开发(二)焦点控制(键盘事件)

    上篇文章中说道了触控事件,但是只对MotionEvent做了细说,很多东西还是不懂怎么用触控事件,现在就做对上篇的补充吧

在view重写onTouchEvent方法,通过event.getAction()对不同的enent就可以处理了,代码如下

  1. public boolean onTouchEvent(MotionEvent event)  
  2.     {  
  3.         int events[] = {MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE,  
  4.                 MotionEvent.ACTION_UP, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_OUTSIDE,  
  5.                 MotionEvent.ACTION_POINTER_DOWN,MotionEvent.ACTION_POINTER_UP,  
  6.                 MotionEvent.EDGE_TOP,MotionEvent.EDGE_BOTTOM,MotionEvent.EDGE_LEFT,MotionEvent.EDGE_RIGHT};  
  7.           
  8.         String szEvents[]={"ACTION_DOWN""ACTION_MOVE",  
  9.         "ACTION_UP""ACTION_MOVE""ACTION_CANCEL""ACTION_OUTSIDE",  
  10.         "ACTION_POINTER_DOWN","ACTION_POINTER_UP",  
  11.         "EDGE_TOP","EDGE_BOTTOM","EDGE_LEFT","EDGE_RIGHT"};  
  12.         for(int i=0; i < events.length; i++)  
  13.         {  
  14.             if(events[i] == event.getAction())  
  15.             {  
  16.                 if(oldevent != event.getAction())  
  17.                 {  
  18.                     DisplayEventType(szEvents[i]);  
  19.                     oldevent = event.getAction();  
  20.                 }  
  21.                 break;  
  22.             }  
  23.         }  
  24.         return super.onTouchEvent(event);  
  25.     }  
好了 不说了 今天言归正传,就来接着说键盘事件,keyevent.

KeyEvent事件对象

   一  keyevent包括以下类型
    KeyEvent.KEYCODE_DPAD_UP; 上
    KeyEvent.KEYCODE_DPAD_DOWN; 下
   KeyEvent.KEYCODE_DPAD_LEFT;左
   KeyEvent.KEYCODE_DPAD_RIGHT;右
   KeyEvent.KEYCODE_DPAD_CENTER;确定键
   KeyEvent.KEYCODE_DPAD_RIGHT; 右
  KeyEvent.KEYCODE_XXX:数字键 (xx表示你按了数字几)
   KeyEvent.KEYCODE_BACK; 返回键
   KeyEvent.KEYCODE_HOME;房子键

 二 键盘事件
     键盘事件比较简单,直接重写onKeyDown或者onKeyUP方法就可以了。down方法如下,其他一样,比如TV遥控器监听确定以及上下左右的时候,可以通过此方法实现频道,和确定的功能。之后的主页UI就会用到以下方法。

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


  在了解这个时间之前,先熟悉下dispatchkeyeventonkeydown和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的用法,这样我们自己绘制一个鼠标,在里面相应代码处理相应逻辑就可以具体实现代码之后将会发布。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。