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

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. Major and minor numbers

    The major nuber is the driver associated with the device, while the minor number is used by the kern ...

  2. CSS中RGBA的兼容方法以及透明度计算方法

    CSS对IE使用背景透明 实现 rgba 效果 height:35px; background: -webkit-gradient(linear,left top,left bottom,from(r ...

  3. 2、变量var关键字

    我们在看js声明变量的时候,经常会发现有的变量前会带var 但又的则没有,那么这究竟有什么区别呢? 如果这种情况发生在函数里的话, 加var定义的变量是局部变量,不加var定义的就成了全局变量. // ...

  4. HDU 1008 u Calculate e

    Problem Description A simple mathematical formula for e is where n is allowed to go to infinity. Thi ...

  5. (负)-margin在页面布局中的应用

    有关margin的原理可以看看这篇文章:http://www.cnblogs.com/2050/archive/2012/08/13/2636467.html#2457812 有关margin负值的几 ...

  6. ubuntu环境下jdk安装及jenkins安装

    本文内容参考http://jingyan.baidu.com/article/c33e3f48a3365dea15cbb5c9.html 1 jdk下载 安装 http://www.oracle.co ...

  7. LeetCode OJ 229. Majority Element II

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...

  8. 取URL得值

    有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL中的各个GET参数(参 ...

  9. NOIP2012-普及组复赛-第二题-寻宝

    题目描述 Description 传说很遥远的藏宝楼顶层藏着诱人的宝藏.小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书.说明书的内容如下:藏宝楼共有 ...

  10. 获取android源码中遇到的问题

    最近项目相当紧张,回家之后还需要继续研究android源码. 从网上找了一些资料,下载过程中还是遇到了很多问题.这里罗列一下: 1. 下载Repo过程中提示证书问题: curl https://dl- ...