物理按键
一、 检测物理按键的方法:不用注册监听器,直接在活动页面检测物理按键即可,即重写Activity的onKeyDown方法。
public boolean onKeyDown(int keyCode, KeyEvent event) {
desc = String.format("%s物理按键的编码是%d", desc, keyCode);
if (keyCode == KeyEvent.KEYCODE_BACK) {
desc = String.format("%s, 按键为返回键", desc);
// 延迟3秒后启动页面关闭任务
new Handler().postDelayed(mFinish, 3000);
} else if (keyCode == KeyEvent.KEYCODE_MENU) {
desc = String.format("%s, 按键为菜单键", desc);
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
desc = String.format("%s, 按键为加大音量键", desc);
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
desc = String.format("%s, 按键为减小音量键", desc);
}
desc = desc + "\n";
tv_result.setText(desc);
// 返回true表示不再响应系统动作,返回false表示继续响应系统动作
return true;
}
onKeyDown方法只可检测4个物理按键事件,即菜单键、返回键、加大音量键和减小音量键,而主页键和任务键则就需要通过广播接收器来监测。
二、onKeyDown与onKey的区别
在使用onKeyDown方法之后,可以发现onKeyDown与onKey的不同之处:
- onKeyDown只能在Activity代码中使用,而onKey只要有可注册的控件就能使用。
- onKeyDown只能检测物理按键,无法检测输入法按键(如回车键、删除键等),而onKey可同时检测两类按键。
- onKeyDown不区分按下与松开两个动作,而onKey区分这两个动作。
三、Android常用的物理按键及其触发事件
- KEYCODE_POWER 电源键
- KEYCODE_MENU 菜单键
- KEYCODE_BACK 后退键
- KEYCODE_HOME Home键
- KEYCODE_CAMERA 相机键
- KEYCODE_SEARCH 查找键
- KEYCODE_VOLUME_UP 音量键+
- KEYCODE_VOLUME_DOWN 音量键-
- KEYCODE_VOLUME_MUTE 静音
提供的回调方法有 :onKeyUp()、OnKeyDown()、onKeyLongPress()
/**
* 重写onKeyDown方法可以拦截系统默认的处理
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
Toast.makeText(this, "后退键", Toast.LENGTH_SHORT).show();
return true;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
Toast.makeText(this, "声音+", Toast.LENGTH_SHORT).show();
return false;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
Toast.makeText(this, "声音-", Toast.LENGTH_SHORT).show();
return false;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) {
Toast.makeText(this, "静音", Toast.LENGTH_SHORT).show();
return false;
} else if (keyCode == KeyEvent.KEYCODE_HOME) {
Toast.makeText(this, "Home", Toast.LENGTH_SHORT).show();
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* 重写onTouchEvent方法可以处理Touch事件
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (event.getAction() == MotionEvent.ACTION_MOVE) {
Toast.makeText(this, "ACTION_MOVE", Toast.LENGTH_SHORT).show();
} else if (event.getAction() == MotionEvent.ACTION_UP) {
Toast.makeText(this, "ACTION_MOVE", Toast.LENGTH_SHORT).show();
} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
Toast.makeText(this, "ACTION_MOVE", Toast.LENGTH_SHORT).show();
}
return super.onTouchEvent(event);
}