Android
学习自修笔记(一)
键盘按下和抬起事件(keydown
,keyup
)
————将军的Android
自修之途
通常按键的动作分为单击、按下和抬起,但实际上单击并不能算单独的按键事件,因为系统底层(Linux
内核)在按键按下时会发出一个中断,在按键抬起时也会发送一个中断,并没有在按键单击时发中断。其实按键单击就是按键按下和抬起的组合动作,所以窗口事件中并不能捕获按键单击事件,而只能捕获按键按下和抬起事件,分别用onKeyDown
和onKeyUp
方法捕获。
源码实例如下:
public class ActivityEventMain extends Activity {
public class ActivityEventMain extends Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_event_main
);
}
//
捕获按键按下事件
public
boolean
onKeyDown(
int
keycode,KeyEvent event){
//
输出按键代码
Log.d(
"onKeyDown:keycode"
,String.valueOf(keycode));
//
输出按键重复次数
Log.d(
"onKeyDown:RepeatCount"
, String.valueOf(event.getRepeatCount()));
//
如果重复次数到了
200(8
秒左右
)
,显示提示
if
(event.getRepeatCount()==200)
{
Toast.makeText(
this
,
"
已经按一会了,累了吧,该松开了!
"
, Toast.
LENGTH_LONG
).show();
}
//
如果按下的是
“
菜单
”
按钮,输出日志信息
if
(keycode==KeyEvent.
KEYCODE_MENU
)
{
Log.d(
"onKeyDown"
,
"MenuKeyDown"
);
}
return
super
.onKeyDown(keycode, event);
}
//
捕获按键抬起事件
public
boolean
onKeyUp(
int
keycode,KeyEvent event)
{
if
(keycode==KeyEvent.
KEYCODE_MENU
)
{
Log.d(
"onKeyUp"
,
"MenuKeyDown"
);
}
return
super
.onKeyUp(keycode, event);
}
}
其中onKeyDown
和onKeyUp
方法的参数和类型完全一样,其中Keycode
表示按下或抬起的按键代码,通过event
参数则可以获得更多的按键信息。其中有一个KeyEvent.getKeyCode
方法与keycode
参数的含义完全一样。如果这两个方法返回true
,表示按键事件已经处理完毕。
注意:处理键盘事件的方法不止一个,这些方法是以一个链表形式组织在一起的,当前方法执行完,会执行下一个方法。如果其中某一个方法返回true
,系统就不会在调用后面的方法处理按键事件了。
使用onkeyDown
和onkeyup
方法捕捉事件应了解如下几点:
(1 )onkeyDown 和onkeyup 方法不能捕捉“Home” 按键
(1 )onkeyDown 和onkeyup 方法不能捕捉“Home” 按键
(2
)按键重复次数是指按下按键还没有抬起的期间系统会以一定时间间隔不断发送键盘按下中断,也就是说会不断调用onkeyDown
方法,使用KeyEvent.getRepeatCount
方法可以获取调用onkeyDown
方法的次数,也就是按键重复次数,RepeatCount
从0
开始。如果按键抬起,并再次按下,RepeatCount
会清零。
(3
)所有的物理按键的按下和抬起动作都由onkeyDown
和onkeyup
方法捕获,如果想判断具体按下了哪个按键,可以使用keycode
参数,也可以使用keyEvent.getKeycode
方法。可以直接通过按键编码进行判断,但是最好使用在KeyEvent
类中定义的表示按键编码的常量,所有表示按键编码的常量都以“KEYCODE”
开头。