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

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. 基础dp

    队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加 ...

  2. ES 集群调整、升级 最佳实践

    日常应用中我们会经常对es 集群做一些参数调整或者升级版本,但是每次关闭节点再打开 其中的数据同步的痛苦估计有很多人领悟过(有可能出现IO或者网络拥堵导致恶性循环)官网有套方案可以尝试一下: 1.关掉 ...

  3. CodeForces 702E Analysis of Pathes in Functional Graph

    倍增预处理. 先看一下这张图的结构,因为出度都是$1$,所以路径是唯一的,又因为每个点都有出度,所以必然有环,也就是一直可以走下去. 接下来我们需要记录一些值便于询问: 设$t[i][j]$表示从$i ...

  4. CodeForces 700A As Fast As Possible

    要保证总时间最短,因为总时间计的是最后一个人到达的时间,也就是最后一个人要求尽快到达,也就是说我们要让最后一个人乘车时间尽量多.再仔细想想可以发现每个人的乘车时间和走路时间都是一样的. 因此,可以二分 ...

  5. 实现koa中的generator用法

    尽管koa2中已经被async/await代替.但我还是想自个儿着写一个koa1中的generator. 一, 写这个之前,先写一个可以现实,express中next用法的函数: var event= ...

  6. Jira 6.0.3安装破解汉化

    前段时间和上海的朋友交流了下,他们公司使用JIRA管理项目.回来整理了下感觉很不错. http://www.unlimax.com/jira.html工作中总是有各种事务要去处理,而这些事务不仅仅是代 ...

  7. 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法--(转)

    如有雷同,不胜荣幸,若转载,请注明 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法 最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了boot ...

  8. 《JS权威指南学习总结--6.4检测属性》

    内容要点: js对象可以看做属性的集合,我们经常会检测集合中成员的所属关系-----判断某个属性是否存在于某个对象中,可以通过in运算符,hasOwnPreperty()和propertyIsEnum ...

  9. ORACLE 11g dblink 配置升级

    1.如果需要创建全局 DBLink,则需要先确定用户有创建 dblink 的权限: select * from user_sys_privs where privilege like upper('% ...

  10. deque (STL)

    //双端队列 //deque的成员函数 c.assign(beg, end); //将[beg, end]区间中的数据赋值给c c.assign(n, elem); //将n个elem的拷贝赋值给c ...