范例说明
D-Pad在HTC G1(Dream)是一个5个方向的按键,但HTC G2(Magic)则是改成滚轮。无论是哪一种D-Pad形式,在程序中都需要重写onKeyDown()事件,以捕捉User所单击的按键。
这是一个通过D-Pad与User互动的练习,当User单击D-Pad上的上、下、左、右4个方向按键时,会直接更改在Layout上的按钮绝对坐标,以此范例练习捕捉onKeyDown事件,以及更改Widget在Layout里位置的方法。需要留意的是本范例中的AbsoluteLayout类已经被deprecated(弃用)了,但笔者仍保留此范例作为参考之用。
范例程序
src/irdc.ex05_20/EX05_20.java
范例
程序继承自Activity,并在其中绑定了一个按钮(mButton01),当Activity onCreate()时,则调用RestoreButton()方法,这是一个自定义的方法,其功能为判断User手机的屏幕分辨率,并将按钮居中存放。
留意Activity里重写了onKeyDown()方法,其传入的参数为keyCode与KeyEvent,前者为按键代码,为整数;后者为KeyEvent对象,常见其构建的方法为KeyEvent(int action, int code)。
在keyCode方面,则是将其与KeyEvent.KEYCODE_*进行比较来做判断,以KeyEvent. KEYCODE_DPAD_CENTER、KeyEvent.KEYCODE_DPAD_UP、KeyEvent.KEYCODE_DPAD_ DOWN、KeyEvent.KEYCODE_DPAD_LEFT、KeyEvent.KEYCODE_DPAD_RIGHT作“上”、 “下”、“左”、“右”、“中央单击”等5个方向的事件。
/* import程序略 *///以下AbsoluteLayout已不建议使用,此范例供旧版本兼容参考import www.ligootp.comimport android.widget.AbsoluteLayout;@SuppressWarnings("deprecation")public class EX05_20 extends Activity{ private Button mButton01; private int intWidth, intHeight, intButtonX, intButtonY; /* 保存屏幕的分辨率 */ private int intScreenX, intScreenY; /* 按钮位移的平移量 */ private int intShift = 2; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); /* 取得屏幕解析像素 */ intScreenX = dm.widthPixels; intScreenY = dm.heightPixels; /* 定义按钮的宽x高 */ intWidth = 80; intHeight = 40; mButton01 =(Button) findViewById(R.id.myButton1); /* 初始化按钮位置置中 */ RestoreButton(); /* 当按下按钮,还原初始位置 */ mButton01.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub RestoreButton(); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub switch(keyCode) { /* 中间按键 */ case KeyEvent.KEYCODE_DPAD_CENTER: /* keyCode=23 */ RestoreButton(); break; /* 上按键 */ case KeyEvent.KEYCODE_DPAD_UP: /* keyCode=19 */ MoveButtonUp(); break; /* 下按键 */ case KeyEvent.KEYCODE_DPAD_DOWN: /* keyCode=20 */ MoveButtonDown(); break; /* 左按键 */ case KeyEvent.KEYC