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

dpad.xml

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

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那个字符,代码如下:

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。

android之DPAD上下左右四个键控制相关推荐

  1. java 上下键_用键盘的上下左右键控制JAVA SWING UI中的组件的移动等事件 | 学步园...

    用键盘的上下左右键控制JAVA SWING UI中的组件的移动等事件 import java.awt.*; import java.awt.event.*; import javax.swing.*; ...

  2. Unity中C#代码学习用wasd和上下左右键控制物体前后左右上下移动和绕轴旋转

    Unity中C#代码学习用wasd和上下左右键控制物体前后左右上下移动和绕轴旋转 using System.Collections; using System.Collections.Generic; ...

  3. html屏蔽上下左右键控制页面,【案例】使用上下左右键控制元素的移动

    使用键盘上下左右键控制小球移动 *{ margin:0; padding:0; } #ball{ width: 200px; height: 200px; background: pink; bord ...

  4. android物理返回键控制

    android物理返回键控制 转载请指明出处 博主版权所有 有些攻城狮做任务需要控制物理返回键 home键 本人观点谷歌屏蔽了home键 网上好多示例代码都没用 在这里示范一下物理返回键的控制吧 关键 ...

  5. html键盘控制一串元素移动,【案例】使用上下左右键控制元素的移动

    使用键盘上下左右键控制小球移动 *{ margin:0; padding:0; } #ball{ width: 200px; height: 200px; background: pink; bord ...

  6. Android开发笔记(四十三)点击事件

    按钮点击 常用按钮点击 1.单击事件,主要用于Button和ImageButton控件,布局视图与TextView.ImageView控件用的也比较多.相关类名与方法说明如下: 监听器类名 : Vie ...

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

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

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

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

  9. Android项目实战(四):ViewPager切换动画(3.0版本以上有效果)

    原文:Android项目实战(四):ViewPager切换动画(3.0版本以上有效果) 学习内容来自"慕课网" 一般APP进去之后都会有几张图片来导航,这里就学习怎么在这张图片切换 ...

最新文章

  1. pyspark基础教程
  2. python中的接口
  3. angularjs 路由 传参
  4. 【转】vs平台工具集介绍,vc6~vs2019各IDE对应的工具集版本
  5. [LeetCode] Longest Consecutive Sequence 求解
  6. 分号可以用来分段么_更高效的GMX分段模拟方法:修改tpr文件
  7. 多站点IIS的架设:端口法
  8. 苹果充电线android头断了,苹果充电线又坏了?其实一招就能搞定!还不花1分钱......
  9. eclipse不能自动编译生成class文件的解决办法
  10. 软件项目管理 第七章 进度计划
  11. 前端不错的相关网站和论坛
  12. delphi php post,delphi idhttp post 网页,该如何解决
  13. HTML笔记(课堂笔记整合)
  14. 【年终】电感两端施加正弦波电流,电感两端的电压波形是怎样的?
  15. 解决TeamViewer远程连接受阻的方法
  16. K210学习笔记(十)——二维码识别
  17. Springboot+Redis初体验
  18. Win7双网卡共享上网
  19. php 栏目名称,PHPCMS V9调用栏目ID,栏目名称,父栏目,顶级父栏目
  20. c语言 malloc 函数用法

热门文章

  1. HTML链接跳转与vue链接跳转
  2. 一位全加器及四位全加器————FPGA
  3. mac下忘了密码,如何开机?
  4. 配置squid 代理
  5. 惹某人de集训第4周学习摘录(习题+感悟)
  6. 软件工程师,用100天时间让CSDN粉丝数从0狂飙到10000
  7. 【教程】ArcGIS水文分析提取河流及流域
  8. vue 或 js 使用谷歌翻译实现国际化
  9. 海康威视视频监控demo 源码+库文件
  10. STM32 ADC NTC热敏电阻二分(折半)查表法实现测温功能