在应用的程序的控制方面,更多的使用的是屏幕上的控件,但是有的时候也需要直接对键盘事件来进行响应。键盘是Android中主要的输入设备,对按键的响应的处理是响应之间在程序中使用键盘的核心内容。
本例需要实现的内容是通过键盘来控制屏幕上的一个图片的Alpha值,使用上键和右键增加图片的Alpha值,使用下键和左键减少图片的Alpha值。显示内容如下所示:
本例的布局文件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用于显示一个图片。
本例的源代码实现如下所示:
package com.android.basicapp;
import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.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接口,可以获得按键相关的详细信息。