我们代码的目的很简单,那就是监听上下左右中这几个键的事件触发。直接上代码:

dpad.xml

[xhtml:nogutter] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <AbsoluteLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:orientation="vertical"  
  5.   android:layout_width="fill_parent"  
  6.   android:layout_height="fill_parent"  
  7.   android:background="#FFFFFF"  
  8.   >  
  9.   <Button  
  10.     android:id="@+id/myButton1"  
  11.     android:layout_width="wrap_content"  
  12.     android:layout_height="wrap_content"  
  13.     android:text="move me"  
  14.     android:layout_x="20px"  
  15.     android:layout_y="40px" />  
  16. </AbsoluteLayout>  

 

activity代码:

[java:nogutter] view plaincopyprint?
  1. package cn.com.chenzheng_java;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.DisplayMetrics;  
  6. import android.view.KeyEvent;  
  7. import android.widget.AbsoluteLayout;  
  8. import android.widget.Button;  
  9. import android.widget.Toast;  
  10. /** 
  11.  * @description 控制手机的上下左右四个方向键 
  12.  * @author chenzheng_java 
  13.  *  
  14.  */  
  15. public class DpadActivity extends Activity {  
  16.     Button button;  
  17.     DisplayMetrics metrics = new DisplayMetrics();  
  18.     int screenx = 0 ;//屏幕宽度   
  19.     int screeny = 0 ;//屏幕高度   
  20.     int buttonWidth = 80;//按钮宽度   
  21.     int buttonHeight = 40 ;// 按钮高度   
  22.     int currentX = 0;// 按钮的当前x坐标   
  23.     int currentY = 0;// 按钮的当前Y坐标   
  24.     int step = 0;//移动时候的步长   
  25.     @Override  
  26.     protected void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.dpad);  
  29.         button = (Button) findViewById(R.id.myButton1);  
  30.         getWindowManager().getDefaultDisplay().getMetrics(metrics);  
  31.         screenx = metrics.widthPixels;  
  32.         screeny = metrics.heightPixels;  
  33.     /*  buttonWidth = button.getWidth(); 
  34.         buttonHeight = button.getHeight();*/  
  35.           
  36.         currentX = (screenx-buttonWidth)/2;  
  37.         currentY = (screeny-buttonHeight)/2;  
  38.         step = 2;  
  39.           
  40.         button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY));  
  41.           
  42.     }  
  43.       
  44.     /** 
  45.      * 当前后左右键被按下的时候,被触发(这里可是有前提的哦,那就是当前的activity中必须没有view正在监听按键 
  46.      * ,例如:当前如果有一个EditText正在等待输入,当我们按下dpad时,不会触发事件哦) 
  47.      * Activity.onKeyDown();  
  48. 当某个键被按下时会触发,但不会被任何的该Activity内的任何view处理。  
  49. 默认按下KEYCODE_BACK键后会回到上一个Activity。  
  50.      */  
  51.     @Override  
  52.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  53.         switch (keyCode) {  
  54.         case KeyEvent.KEYCODE_DPAD_DOWN://按向下键   
  55.             moveDown();  
  56.             break;  
  57.         case KeyEvent.KEYCODE_DPAD_UP:// 按向上键   
  58.             moveUp();  
  59.         case KeyEvent.KEYCODE_DPAD_LEFT://按向左键   
  60.             moveLeft();  
  61.         case KeyEvent.KEYCODE_DPAD_RIGHT://按向右键   
  62.             moveRight();  
  63.         default:  
  64.             break;  
  65.         }  
  66.           
  67.         return super.onKeyDown(keyCode, event);  
  68.     }  
  69.       
  70.       
  71.     @SuppressWarnings("deprecation")  
  72.     private void moveDown(){  
  73.         int temp = currentY+step;  
  74.         if(temp>(screeny-buttonHeight)){  
  75.             showToast("到头了哦!");  
  76.             button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, screenx, screeny-buttonHeight));  
  77.         }  
  78.         else{  
  79.             currentY = currentY+step;  
  80.             AbsoluteLayout.LayoutParams params =   
  81.                 new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY);  
  82.             button.setLayoutParams(params);  
  83.               
  84.         }  
  85.     //button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY-2));   
  86.           
  87.           
  88.     }  
  89.       
  90.     @SuppressWarnings("deprecation")  
  91.     private void moveUp(){  
  92.         int temp = currentY-step;  
  93.         if(temp<=0){  
  94.             showToast("往上到头了哦!");  
  95.             button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, screenx, 0));  
  96.         }  
  97.         else{  
  98.             currentY = currentY-step;  
  99.             AbsoluteLayout.LayoutParams params =   
  100.                 new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY);  
  101.             button.setLayoutParams(params);  
  102.         }  
  103.           
  104.           
  105.     }  
  106.       
  107.     @SuppressWarnings("deprecation")  
  108.     private void moveLeft(){  
  109.         int temp = currentX-step;  
  110.         if(temp<=0){  
  111.             showToast("往左边到头了哦!");  
  112.             button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, 0, screeny));  
  113.         }  
  114.         else{  
  115.             currentX = currentX-step;  
  116.             AbsoluteLayout.LayoutParams params =   
  117.                 new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY);  
  118.             button.setLayoutParams(params);  
  119.         }  
  120.           
  121.           
  122.     }  
  123.       
  124.     @SuppressWarnings("deprecation")  
  125.     private void moveRight(){  
  126.         int temp = currentX+step;  
  127.         if(temp>=(screenx-buttonWidth)){  
  128.             showToast("往右边到头了哦!");  
  129.             button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, screenx-buttonWidth, currentY));  
  130.         }  
  131.         else{  
  132.             currentX = currentX+step;  
  133.             AbsoluteLayout.LayoutParams params =   
  134.                 new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY);  
  135.             button.setLayoutParams(params);  
  136.         }  
  137.           
  138.           
  139.     }  
  140.       
  141.     /** 
  142.      * 弹出提示信息 
  143.      * @param text 提示信息 
  144.      */  
  145.     private void showToast(String text){  
  146.         Toast.makeText(this, text, Toast.LENGTH_LONG).show();  
  147.           
  148.     }  
  149.       
  150. }  

 

---------------------------------------------------------------------------------------

       这里我们可以看到,要想监听这几个方向键,那么我们必须重写 public boolean onKeyDown(int keyCode, KeyEvent event)这个方法,该方法定义在Activity中,其中keyCode便是代表着你点击的那个键的标识符,KeyEvent 则是一个事件。

      需要注意的是,坐标问题:我们控制的按钮的坐标实际上是左上角的坐标。而屏幕的向左是X轴,向下是Y轴,也就是说,只要在屏幕内显示的组件,其坐标都是正数的。

     当然键盘中所有的键都可以监听的,我们亦可以来监听A-Z这些键,他们的keyCode依次是KEYCODE_A -------KEYCODE_Z.

     这里有一个小技巧,可以判断出用户输入的是什么A-Z那个字符,代码如下:

[java:nogutter] view plaincopyprint?
  1. int code = 'A'+keycode-29;  
  2. char ch = (char)code;  

 

如果我们无法获取当前的按键,我们可以通过keycode_unknown来捕捉。

控制音量大小:keycode_volume_down / keycode_volume_up.

 

-----------------------------------------------------------------------------------------

关于KeyEvent,它代表了我们点击键盘时的事件,看下图,我们可以创建自己的键盘事件

其中参数中的action,代表了用户的操作,值为ACTION_DOWN、ACTION_UP、ACTION_MULTIPLE其中的一个。而code则代表了我们的标识符,入上面提到的keycode_volume_down 就是一个code。

posted on 2012-05-21 15:54  清沁  阅读(1064)  评论(0编辑  收藏  举报