android之DPAD上下左右四个键控制
我们代码的目的很简单,那就是监听上下左右中这几个键的事件触发。直接上代码:
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上下左右四个键控制的更多相关文章
- Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!
Android实训案例(四)--关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程! 关于2048,我看到很多大神,比如医生,郭神,所以我也研究了一段时间,还好是研究 ...
- Android Animation学习(四) ApiDemos解析:多属性动画
Android Animation学习(四) ApiDemos解析:多属性动画 如果想同时改变多个属性,根据前面所学的,比较显而易见的一种思路是构造多个对象Animator , ( Animator可 ...
- Android bluetooth介绍(四): a2dp connect流程分析
关键词:蓝牙blueZ A2DP.SINK.sink_connect.sink_disconnect.sink_suspend.sink_resume.sink_is_connected.sink_ ...
- Android:Mstar Android8.0平台音量控制流程
一.Speaker 音量.静音流程分析 java层音量设置首先调用到的是AudioManager.java中的方法,在这里有两种方法可以设置音量 setStreamVolume 和 adjustStr ...
- .net之工作流工程展示及代码分享(四)主控制类
现在应该讲主控制类了,为了不把系统弄得太复杂,所以就用一个类作为主要控制类(服务类),作为前端.后端.业务逻辑的控制类. WorkflowService类的类图如下: 该类的构造函数: public ...
- Android下添加新的自定义键值和按键处理流程
Android下添加新的自定义键值和按键处理流程 说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...
- Android UI开发第四十篇——ScrollTricks介绍
ScrollTricks是一个开源控件,实现了两个简单功能: 1.Quick Return:向上滑动时,View也向上滑动并且消失,当向下滑动时,View马上出现.例如Google Now的搜索功能. ...
- Android Studio系列教程四--Gradle基础
Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...
- Android Bitmap 全面解析(四)图片处理效果对比 ...
对比对象: UIL Volley 官方教程中的方法(此系列教程一里介绍的,ImageLoader的处理方法和官方的差不多) -------------------------------------- ...
随机推荐
- HTML下直接调用Less文件
虽然有很多编译Less的插件可以使用 , 但是在开发的时候 , 每修改一次less代码就编译一次less文件 , 很明显效率就太低了 , 接下来为大家介绍一个直接在html的link标签中引入.les ...
- 给hexo添加评论系统
默认主题 landscape 文件目录,comments为新建的 _config.yml layout -- _partial -- article.ejs |- comments -- disqus ...
- iosTableView 局部全部刷新以及删除编辑操作
局部刷新方法 添加数据 NSArray *indexPaths = @[ [NSIndexPath indexPathForRow:0 inSection:0], [NSIndexPath index ...
- 第五十九节,模拟浏览器请求Python结合html基本格式
模拟浏览器请求Python结合html基本格式 用Python模拟一个客户端,结合打开一个HTML页面 创建客户端 #!/usr/bin/env python # -*- coding:utf8 -* ...
- 1、File类的API
通过Api我们可知,File类是java一个内置类,被封装到java.io.jar包中 其构造方法有一下3种 其方法常用的有以下几种
- 《JS权威指南学习总结--第八章 函数》
内容要点: 一.JS函数是参数化的:函数的定义会包括一个称为形参的标识符列表,这些参数在函数体中像局部变量一样工作.函数调用会为形参提供实参的值.函数使用它们实参的值来计算返回值,成为该函数调用表达式 ...
- 高效PHP程序必知的53个技巧
用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说 ...
- Java IO 嵌套流、文本的输入输出和存储
Java IO 嵌套流.文本的输入输出和存储 @author ixenos 1. 组合流过滤器(嵌套流) a) 跨平台文件分割符:常量字符串 java.io.File.seperator 等 ...
- AUTO_INCREMENT列在InnoDB里如何工作
如果你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值.自动增长计数器仅被存储在主内存中,而不是存在磁盘上. Inn ...
- 第二次冲刺spring会议(第六次会议)
[例会时间]2014/5/8 21:15 [例会地点]9#446 [例会形式]轮流发言 [例会主持]马翔 [例会记录]兰梦 小组成员:兰梦 ,马翔,李金吉,赵天,胡佳 奇