6.2 键盘事件的响应

在应用的程序的控制方面,更多的使用的是屏幕上的控件,但是有的时候也需要直接对键盘事件来进行响应。键盘是 Android 中主要的输入设备,对按键的响应的处理是响应之间在程序中使用键盘的核心内容。

本例需要实现的内容是通过键盘来控制屏幕上的一个图片的 Alpha 值,使用上键和右键增加图片的 Alpha 值,使用下键和左键减少图片的 Alpha 值。显示内容如下所示:

速读原著-Android应用开发入门教程(键盘事件的响应)_键码

速读原著-Android应用开发入门教程(键盘事件的响应)_控件_02

本例的布局文件 testkeyevent.xml 如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/screen"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView android:id="@+id/alphavalue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
<ImageView android:id="@+id/image"
android:src="@drawable/robot"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

本例包含了一个文本框和一个显示图片的控件,这样可以文本框用作显示当前的 Alpha 的比例值,显示图片的控件 ImageView 用于显示一个图片。

本例的源代码实现如下所示:

public class TestKeyEvent extends Activity {
private static final String TAG = "TestKeyEvent";
private ImageView mImage;
private TextView mAlphavalueText;
private int mAlphavalue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testkeyevent);
mImage = (ImageView) findViewById(R.id.image);
mAlphavalueText = (TextView) findViewById(R.id.alphavalue);
mAlphavalue = 100;
mImage.setAlpha(mAlphavalue);
mAlphavalueText.setText("Alpha = " + mAlphavalue*100/0xff + "%");
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent msg){
Log.v(TAG, "onKeyDown: keyCode = "+ keyCode);
Log.v(TAG, "onKeyDown: String = " + msg.toString());
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_RIGHT:
mAlphavalue += 20;
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
case KeyEvent.KEYCODE_DPAD_LEFT:
mAlphavalue -= 20;
break;
default:
break;
}
if(mAlphavalue>=0xFF)mAlphavalue = 0xFF;
if(mAlphavalue<=0x0)mAlphavalue = 0x0;
mImage.setAlpha(mAlphavalue);
mAlphavalueText.setText("Alpha = " + mAlphavalue*100/0xff + "%");
return super.onKeyDown(keyCode, msg);
}
}

本例子使用 onKeyDown()函数来获得按键的事件,同类的函数还包括 onKeyUp()函数,其参数 int keyCode 为按键码,KeyEvent msg 表示按键事件的消息(其中包含了更详细的内容)。

上面打出的 log 信息为:

VERBOSE/TestKeyEvent(771): onKeyDown: keyCode = 20 
VERBOSE/TestKeyEvent(771): onKeyDown: String = KeyEvent{action=0 code=20 repeat=0 meta=0 scancode=108 mFlags=8}

基本上通过 keyCode 可以获得是哪一个按键响应,而通过 msg 除了按键码之外,可以获得按键的动作(抬起、按下)、重复信息,扫描码等内容。

KeyEvent 主要包含以下一些接口:

final int getAction() // 获得按键的动作
final int getFlags() // 获得标志
final int getKeyCode() // 获得按键码
final int getRepeatCount() // 获得重复的信息
final int getScanCode() // 获得扫描码

通过 KeyEvent 接口,可以获得按键相关的详细信息。