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

dpad.xml

  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代码:

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

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

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

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

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

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

  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。

android之DPAD上下左右四个键控制的更多相关文章

  1. Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!

    Android实训案例(四)--关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程! 关于2048,我看到很多大神,比如医生,郭神,所以我也研究了一段时间,还好是研究 ...

  2. Android Animation学习(四) ApiDemos解析:多属性动画

    Android Animation学习(四) ApiDemos解析:多属性动画 如果想同时改变多个属性,根据前面所学的,比较显而易见的一种思路是构造多个对象Animator , ( Animator可 ...

  3. Android bluetooth介绍(四): a2dp connect流程分析

    关键词:蓝牙blueZ  A2DP.SINK.sink_connect.sink_disconnect.sink_suspend.sink_resume.sink_is_connected.sink_ ...

  4. Android:Mstar Android8.0平台音量控制流程

    一.Speaker 音量.静音流程分析 java层音量设置首先调用到的是AudioManager.java中的方法,在这里有两种方法可以设置音量 setStreamVolume 和 adjustStr ...

  5. .net之工作流工程展示及代码分享(四)主控制类

    现在应该讲主控制类了,为了不把系统弄得太复杂,所以就用一个类作为主要控制类(服务类),作为前端.后端.业务逻辑的控制类. WorkflowService类的类图如下: 该类的构造函数: public ...

  6. Android下添加新的自定义键值和按键处理流程

            Android下添加新的自定义键值和按键处理流程     说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...

  7. Android UI开发第四十篇——ScrollTricks介绍

    ScrollTricks是一个开源控件,实现了两个简单功能: 1.Quick Return:向上滑动时,View也向上滑动并且消失,当向下滑动时,View马上出现.例如Google Now的搜索功能. ...

  8. Android Studio系列教程四--Gradle基础

    Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...

  9. Android Bitmap 全面解析(四)图片处理效果对比 ...

    对比对象: UIL Volley 官方教程中的方法(此系列教程一里介绍的,ImageLoader的处理方法和官方的差不多) -------------------------------------- ...

随机推荐

  1. 图片加 alt 属性

    图片加 alt 属性 : http://blog.csdn.net/zsj523/article/details/24982643

  2. <?php function say() { echo 'hello world'; } //在这里调用函数 say(); php 调用方法say()

    <?php function say() {     echo 'hello world'; } //在这里调用函数 say(); php 调用方法say()

  3. 0. Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  4. UESTC 1272 Final Pan's prime numbers(乱搞)

    题目链接 Description Final Pan likes prime numbers very much. One day, he want to find the super prime n ...

  5. MVC3+EF4.1学习系列(七)-----EF并发的处理

    看这篇文章之前 推荐园子里的 这个文章已经有介绍了 而且写的很好~~ 可以先看下他的 再看我的 并发 1.悲观并发 简单的说 就是一个用户访问一条数据时 则把这个数据变为只读属性  把该数据变为独占 ...

  6. MySQL5.6新特性Index conditontion pushdow

    index condition pushdown是MySQL5.6的新特性,主要是对MySQL索引使用的优化. Index condition push简称ICP,索引条件下推,将索引条件从serve ...

  7. 转 shell awk 使用详解

    awk简介 awk: 中文意思是报告生成器 能够根据我们输入的信息,将信息格式化以后显示,将定义好的信息以比较美观(直观)的方式显示出来出现比较早,继而出现了new awk(nawk)在windows ...

  8. Time complexity of ArrayList in Java

    The size, isEmpty, get, set, iterator, and listIterator operations run in constant time. The add ope ...

  9. Ajax.BeginForm 异步上传附件 替代方案

      一:问题描述 含有文件信息表单内容,想通过异步上传到服务器,但是使用Ajax.BeginForm上传时,后台无法获取文件信息 二:解决方案 通过  $.ajaxFileUpload 可以实现文件及 ...

  10. Understanding Neural Networks Through Deep Visualization

    当数据一层一层通过更多的卷积层时,你可以得到的特征图像代表的特征就会更加的复杂. 在网络的最后,你也许可以得到一个抽象的物体.如果你想通过可视化方法在卷积神经网络中看到更多的信息.这里有一个工具方便你 ...