• android之DPAD上下左右四个键控制


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

    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。

  • 相关阅读:
    python操作json来存储简单的数据,pickle来操作复杂的数据
    python元组,列表,字典练习
    python文件实现增删改查操作
    socket模拟服务器,客户端下载东西(ftp)
    optiontransferselect标签
    doubleselect标签联动选择框
    datetimepicker标签日期选择器
    combobox标签复合框
    checkboxlist标签多选框组
    使用动态数据的autocomplete标签
  • 原文地址:https://www.cnblogs.com/qingblog/p/2511736.html
Copyright © 2020-2023  润新知