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

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

dpad.xml

[xhtml:nogutter] view plain copy print ?
  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>  

<?xml version="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="move me" android:layout_x="20px" android:layout_y="40px" /> </AbsoluteLayout>

 

activity代码:

[java:nogutter] view plain copy print ?
  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. }  

package cn.com.chenzheng_java; import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.KeyEvent; import android.widget.AbsoluteLayout; import android.widget.Button; import android.widget.Toast; /** * @description 控制手机的上下左右四个方向键 * @author chenzheng_java * */ public class DpadActivity extends Activity { Button button; DisplayMetrics metrics = new DisplayMetrics(); int screenx = 0 ;//屏幕宽度 int screeny = 0 ;//屏幕高度 int buttonWidth = 80;//按钮宽度 int buttonHeight = 40 ;// 按钮高度 int currentX = 0;// 按钮的当前x坐标 int currentY = 0;// 按钮的当前Y坐标 int step = 0;//移动时候的步长 @Override protected void onCreate(Bundle savedInstanceState) { 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(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY)); } /** * 当前后左右键被按下的时候,被触发(这里可是有前提的哦,那就是当前的activity中必须没有view正在监听按键 * ,例如:当前如果有一个EditText正在等待输入,当我们按下dpad时,不会触发事件哦) * Activity.onKeyDown(); 当某个键被按下时会触发,但不会被任何的该Activity内的任何view处理。 默认按下KEYCODE_BACK键后会回到上一个Activity。 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_DOWN://按向下键 moveDown(); break; case KeyEvent.KEYCODE_DPAD_UP:// 按向上键 moveUp(); case KeyEvent.KEYCODE_DPAD_LEFT://按向左键 moveLeft(); case KeyEvent.KEYCODE_DPAD_RIGHT://按向右键 moveRight(); default: break; } return super.onKeyDown(keyCode, event); } @SuppressWarnings("deprecation") private void moveDown(){ int temp = currentY+step; if(temp>(screeny-buttonHeight)){ showToast("到头了哦!"); button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, screenx, screeny-buttonHeight)); } else{ currentY = currentY+step; AbsoluteLayout.LayoutParams params = new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY); button.setLayoutParams(params); } //button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY-2)); } @SuppressWarnings("deprecation") private void moveUp(){ int temp = currentY-step; if(temp<=0){ showToast("往上到头了哦!"); button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, screenx, 0)); } else{ currentY = currentY-step; AbsoluteLayout.LayoutParams params = new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY); button.setLayoutParams(params); } } @SuppressWarnings("deprecation") private void moveLeft(){ int temp = currentX-step; if(temp<=0){ showToast("往左边到头了哦!"); button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, 0, screeny)); } else{ currentX = currentX-step; AbsoluteLayout.LayoutParams params = new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY); button.setLayoutParams(params); } } @SuppressWarnings("deprecation") private void moveRight(){ int temp = currentX+step; if(temp>=(screenx-buttonWidth)){ showToast("往右边到头了哦!"); button.setLayoutParams(new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, screenx-buttonWidth, currentY)); } else{ currentX = currentX+step; AbsoluteLayout.LayoutParams params = new AbsoluteLayout.LayoutParams(buttonWidth, buttonHeight, currentX, currentY); button.setLayoutParams(params); } } /** * 弹出提示信息 * @param text 提示信息 */ private void showToast(String text){ 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 ?
  1. int code = 'A'+keycode-29;  
  2. char ch = (char)code;  

int code = 'A'+keycode-29; 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Android中的Infrared(IR) Blaster来控制您的电视或其他设备。可以使用Android中的Consumer IR API来访问IR Blaster,并向设备发送红外线信号来控制设备。 以下是一个简单的示例代码,演示如何使用IR Blaster API发送IR命令: ```java // 获取红外线传感器管理器 ConsumerIrManager irManager = (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE); // 检查设备是否支持红外线发射功能 if (!irManager.hasIrEmitter()) { Toast.makeText(this, "IR emitter not available", Toast.LENGTH_LONG).show(); return; } // 发送红外线命令 int[] pattern = {2000, 400, 2000, 400, 2000, 400, 2000, 400, 2000, 400, 2000, 400, 2000, 400}; irManager.transmit(38000, pattern); ``` 这个例子发送一个IR命令,其中模式数组描述了一个2000微秒的红外线脉冲,然后是一个400微秒的延迟,然后再次发送2000微秒的红外线脉冲,以此类推。 您可以根据您的需要更改模式数组,以发送不同的命令,例如播放、暂停、音量控制等。 要监听上下左右,您可以在您的应用程序中实现一个KeyEvent的监听器,并在您的按事件处理程序中检查相应的按码。以下是一个示例代码,演示如何监听按事件: ```java @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: // 处理向上被按下的情况 break; case KeyEvent.KEYCODE_DPAD_DOWN: // 处理向下被按下的情况 break; case KeyEvent.KEYCODE_DPAD_LEFT: // 处理向左被按下的情况 break; case KeyEvent.KEYCODE_DPAD_RIGHT: // 处理向右被按下的情况 break; } return super.onKeyDown(keyCode, event); } ``` 这个例子监听D-pad上下左右的按下事件。您可以在相应的情况下执行您的播放器控制逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值