【发布时间】:2011-02-19 17:19:22
【问题描述】:
我正在制作游戏的第一阶段。我有一个可绘制对象,我想在按住 dpad 箭头的同时在屏幕上四处移动。
我设置了一个自定义视图,覆盖了 onKeyDown 和 onKeyUp,并且我有一个 switch 语句来识别被按下的键。如果按下某个键,则该键的布尔值变为真。如果松开键,则布尔值变为假。在另一个例程中,检查布尔值并更新移动。
问题是,我正在测试的设备是 G2,它有自己独特的键盘,没有 dpad,所以我也将 i,j,l,m 作为移动箭头。 (见here,点击图片)在安卓模拟器中,我的设置和移动运行良好。但是,在实际设备上,drawable 根本不响应任何按键。我的兄弟正在为我测试这个(我的手机没有键盘),所以我无法在实际设备上调试。
我的问题是: KeyEvent.KEYCODE_* 常量对于不同的键盘(即 qwerty、非 qwerty 等)是否不同?我是否需要在代码中指定要使用的特定键盘(例如键盘映射)?
欢迎任何帮助或建议。 谢谢。
如果需要,这是我从 onKeyDown 调用的 doKeyDown 例程的示例(非常基于 LunarLander 示例源):
boolean doKeyDown(int keyCode, KeyEvent msg) {
synchronized (mSurfaceHolder) {
// Log.d("KeyDown", "The key pressed was:" + keyCode);
// Log.d("KeyDown", "UP: " + mMove_Up + " DOWN: " + mMove_Down + " LEFT: " + mMove_Left +" RIGHT: " + mMove_Right);
mIsDown = false;
boolean handled = false;
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_UP:
mMove_Up = true;
handled = true;
break;
case KeyEvent.KEYCODE_I: //Also up
mMove_Up = true;
handled = true;
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
mMove_Down = true;
handled = true;
break;
case KeyEvent.KEYCODE_M: //Also down
mMove_Down = true;
handled = true;
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
mMove_Left = true;
handled = true;
break;
case KeyEvent.KEYCODE_J: // Also left
mMove_Left = true;
handled = true;
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
mMove_Right = true;
handled = true;
break;
case KeyEvent.KEYCODE_L: // Also right
mMove_Right = true;
handled = true;
break;
}
return handled;
}
}
【问题讨论】:
-
LogCat 在第一次按下键时在模拟器中显示:02-19 10:24:58.817: WARN/KeyCharacterMap(343): No keyboard for id 0 02-19 10:24:58.817: WARN /KeyCharacterMap(343):使用默认键盘映射:/system/usr/keychars/qwerty.kcm.bin
标签: android keylistener