android之DPAD上下左右四个键控制
我们代码的目的很简单,那就是监听上下左右中这几个键的事件触发。直接上代码:
dpad.xml
[xhtml:nogutter] view plain copy print ?- <?xmlversion="1.0"encoding="utf-8"?>
- <AbsoluteLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#FFFFFF"
- >
- <Button
- android:id="@+id/myButton1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="moveme"
- android:layout_x="20px"
- android:layout_y="40px"/>
- </AbsoluteLayout>
activity代码:
[java:nogutter] view plain copy print ?- packagecn.com.chenzheng_java;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.util.DisplayMetrics;
- importandroid.view.KeyEvent;
- importandroid.widget.AbsoluteLayout;
- importandroid.widget.Button;
- importandroid.widget.Toast;
- /**
- *@description控制手机的上下左右四个方向键
- *@authorchenzheng_java
- *
- */
- publicclassDpadActivityextendsActivity{
- Buttonbutton;
- DisplayMetricsmetrics=newDisplayMetrics();
- intscreenx=0;//屏幕宽度
- intscreeny=0;//屏幕高度
- intbuttonWidth=80;//按钮宽度
- intbuttonHeight=40;//按钮高度
- intcurrentX=0;//按钮的当前x坐标
- intcurrentY=0;//按钮的当前Y坐标
- intstep=0;//移动时候的步长
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.dpad);
- button=(Button)findViewById(R.id.myButton1);
- getWindowManager().getDefaultDisplay().getMetrics(metrics);
- screenx=metrics.widthPixels;
- screeny=metrics.heightPixels;
- /*buttonWidth=button.getWidth();
- buttonHeight=button.getHeight();*/
- currentX=(screenx-buttonWidth)/2;
- currentY=(screeny-buttonHeight)/2;
- step=2;
- button.setLayoutParams(newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,currentX,currentY));
- }
- /**
- *当前后左右键被按下的时候,被触发(这里可是有前提的哦,那就是当前的activity中必须没有view正在监听按键
- *,例如:当前如果有一个EditText正在等待输入,当我们按下dpad时,不会触发事件哦)
- *Activity.onKeyDown();
- 当某个键被按下时会触发,但不会被任何的该Activity内的任何view处理。
- 默认按下KEYCODE_BACK键后会回到上一个Activity。
- */
- @Override
- publicbooleanonKeyDown(intkeyCode,KeyEventevent){
- switch(keyCode){
- caseKeyEvent.KEYCODE_DPAD_DOWN://按向下键
- moveDown();
- break;
- caseKeyEvent.KEYCODE_DPAD_UP://按向上键
- moveUp();
- caseKeyEvent.KEYCODE_DPAD_LEFT://按向左键
- moveLeft();
- caseKeyEvent.KEYCODE_DPAD_RIGHT://按向右键
- moveRight();
- default:
- break;
- }
- returnsuper.onKeyDown(keyCode,event);
- }
- @SuppressWarnings("deprecation")
- privatevoidmoveDown(){
- inttemp=currentY+step;
- if(temp>(screeny-buttonHeight)){
- showToast("到头了哦!");
- button.setLayoutParams(newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,screenx,screeny-buttonHeight));
- }
- else{
- currentY=currentY+step;
- AbsoluteLayout.LayoutParamsparams=
- newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,currentX,currentY);
- button.setLayoutParams(params);
- }
- //button.setLayoutParams(newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,currentX,currentY-2));
- }
- @SuppressWarnings("deprecation")
- privatevoidmoveUp(){
- inttemp=currentY-step;
- if(temp<=0){
- showToast("往上到头了哦!");
- button.setLayoutParams(newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,screenx,0));
- }
- else{
- currentY=currentY-step;
- AbsoluteLayout.LayoutParamsparams=
- newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,currentX,currentY);
- button.setLayoutParams(params);
- }
- }
- @SuppressWarnings("deprecation")
- privatevoidmoveLeft(){
- inttemp=currentX-step;
- if(temp<=0){
- showToast("往左边到头了哦!");
- button.setLayoutParams(newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,0,screeny));
- }
- else{
- currentX=currentX-step;
- AbsoluteLayout.LayoutParamsparams=
- newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,currentX,currentY);
- button.setLayoutParams(params);
- }
- }
- @SuppressWarnings("deprecation")
- privatevoidmoveRight(){
- inttemp=currentX+step;
- if(temp>=(screenx-buttonWidth)){
- showToast("往右边到头了哦!");
- button.setLayoutParams(newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,screenx-buttonWidth,currentY));
- }
- else{
- currentX=currentX+step;
- AbsoluteLayout.LayoutParamsparams=
- newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,currentX,currentY);
- button.setLayoutParams(params);
- }
- }
- /**
- *弹出提示信息
- *@paramtext提示信息
- */
- privatevoidshowToast(Stringtext){
- Toast.makeText(this,text,Toast.LENGTH_LONG).show();
- }
- }
---------------------------------------------------------------------------------------
这里我们可以看到,要想监听这几个方向键,那么我们必须重写 public boolean onKeyDown(int keyCode, KeyEvent event)这个方法,该方法定义在Activity中,其中keyCode便是代表着你点击的那个键的标识符,KeyEvent 则是一个事件。
需要注意的是,坐标问题:我们控制的按钮的坐标实际上是左上角的坐标。而屏幕的向左是X轴,向下是Y轴,也就是说,只要在屏幕内显示的组件,其坐标都是正数的。
当然键盘中所有的键都可以监听的,我们亦可以来监听A-Z这些键,他们的keyCode依次是KEYCODE_A -------KEYCODE_Z.
这里有一个小技巧,可以判断出用户输入的是什么A-Z那个字符,代码如下:
[java:nogutter] view plain copy print ?- intcode='A'+keycode-29;
- charch=(char)code;
如果我们无法获取当前的按键,我们可以通过keycode_unknown来捕捉。
控制音量大小:keycode_volume_down / keycode_volume_up.
-----------------------------------------------------------------------------------------
关于KeyEvent,它代表了我们点击键盘时的事件,看下图,我们可以创建自己的键盘事件
其中参数中的action,代表了用户的操作,值为ACTION_DOWN、ACTION_UP、ACTION_MULTIPLE其中的一个。而code则代表了我们的标识符,入上面提到的keycode_volume_down 就是一个code。
更多相关文章
- getLayoutInflater().inflate
- 一步步教你实现Android(安卓)HotFix热更新
- 整理 酷炫 Android(安卓)开源UI框架 FAB
- android ui ->>Dialog对话框
- android 实现录像时拍照
- 点击按钮之后仍然显示对话框--Android
- Android(安卓)简单游戏实现笑脸的移动与人物移动
- android图形图像
- Android(安卓)按钮设置边框实例