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

dpad.xml

[xhtml:nogutter] view plain copy print ?
  1. <?xmlversion="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="moveme"
  14. android:layout_x="20px"
  15. android:layout_y="40px"/>
  16. </AbsoluteLayout>

activity代码:

[java:nogutter] view plain copy print ?
  1. packagecn.com.chenzheng_java;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.util.DisplayMetrics;
  5. importandroid.view.KeyEvent;
  6. importandroid.widget.AbsoluteLayout;
  7. importandroid.widget.Button;
  8. importandroid.widget.Toast;
  9. /**
  10. *@description控制手机的上下左右四个方向键
  11. *@authorchenzheng_java
  12. *
  13. */
  14. publicclassDpadActivityextendsActivity{
  15. Buttonbutton;
  16. DisplayMetricsmetrics=newDisplayMetrics();
  17. intscreenx=0;//屏幕宽度
  18. intscreeny=0;//屏幕高度
  19. intbuttonWidth=80;//按钮宽度
  20. intbuttonHeight=40;//按钮高度
  21. intcurrentX=0;//按钮的当前x坐标
  22. intcurrentY=0;//按钮的当前Y坐标
  23. intstep=0;//移动时候的步长
  24. @Override
  25. protectedvoidonCreate(BundlesavedInstanceState){
  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(newAbsoluteLayout.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. publicbooleanonKeyDown(intkeyCode,KeyEventevent){
  48. switch(keyCode){
  49. caseKeyEvent.KEYCODE_DPAD_DOWN://按向下键
  50. moveDown();
  51. break;
  52. caseKeyEvent.KEYCODE_DPAD_UP://按向上键
  53. moveUp();
  54. caseKeyEvent.KEYCODE_DPAD_LEFT://按向左键
  55. moveLeft();
  56. caseKeyEvent.KEYCODE_DPAD_RIGHT://按向右键
  57. moveRight();
  58. default:
  59. break;
  60. }
  61. returnsuper.onKeyDown(keyCode,event);
  62. }
  63. @SuppressWarnings("deprecation")
  64. privatevoidmoveDown(){
  65. inttemp=currentY+step;
  66. if(temp>(screeny-buttonHeight)){
  67. showToast("到头了哦!");
  68. button.setLayoutParams(newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,screenx,screeny-buttonHeight));
  69. }
  70. else{
  71. currentY=currentY+step;
  72. AbsoluteLayout.LayoutParamsparams=
  73. newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,currentX,currentY);
  74. button.setLayoutParams(params);
  75. }
  76. //button.setLayoutParams(newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,currentX,currentY-2));
  77. }
  78. @SuppressWarnings("deprecation")
  79. privatevoidmoveUp(){
  80. inttemp=currentY-step;
  81. if(temp<=0){
  82. showToast("往上到头了哦!");
  83. button.setLayoutParams(newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,screenx,0));
  84. }
  85. else{
  86. currentY=currentY-step;
  87. AbsoluteLayout.LayoutParamsparams=
  88. newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,currentX,currentY);
  89. button.setLayoutParams(params);
  90. }
  91. }
  92. @SuppressWarnings("deprecation")
  93. privatevoidmoveLeft(){
  94. inttemp=currentX-step;
  95. if(temp<=0){
  96. showToast("往左边到头了哦!");
  97. button.setLayoutParams(newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,0,screeny));
  98. }
  99. else{
  100. currentX=currentX-step;
  101. AbsoluteLayout.LayoutParamsparams=
  102. newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,currentX,currentY);
  103. button.setLayoutParams(params);
  104. }
  105. }
  106. @SuppressWarnings("deprecation")
  107. privatevoidmoveRight(){
  108. inttemp=currentX+step;
  109. if(temp>=(screenx-buttonWidth)){
  110. showToast("往右边到头了哦!");
  111. button.setLayoutParams(newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,screenx-buttonWidth,currentY));
  112. }
  113. else{
  114. currentX=currentX+step;
  115. AbsoluteLayout.LayoutParamsparams=
  116. newAbsoluteLayout.LayoutParams(buttonWidth,buttonHeight,currentX,currentY);
  117. button.setLayoutParams(params);
  118. }
  119. }
  120. /**
  121. *弹出提示信息
  122. *@paramtext提示信息
  123. */
  124. privatevoidshowToast(Stringtext){
  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那个字符,代码如下:

[java:nogutter] view plain copy print ?
  1. intcode='A'+keycode-29;
  2. charch=(char)code;

如果我们无法获取当前的按键,我们可以通过keycode_unknown来捕捉。

控制音量大小:keycode_volume_down / keycode_volume_up.

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

关于KeyEvent,它代表了我们点击键盘时的事件,看下图,我们可以创建自己的键盘事件

其中参数中的action,代表了用户的操作,值为ACTION_DOWN、ACTION_UP、ACTION_MULTIPLE其中的一个。而code则代表了我们的标识符,入上面提到的keycode_volume_down 就是一个code。

更多相关文章

  1. getLayoutInflater().inflate
  2. 一步步教你实现Android(安卓)HotFix热更新
  3. 整理 酷炫 Android(安卓)开源UI框架 FAB
  4. android ui ->>Dialog对话框
  5. android 实现录像时拍照
  6. 点击按钮之后仍然显示对话框--Android
  7. Android(安卓)简单游戏实现笑脸的移动与人物移动
  8. android图形图像
  9. Android(安卓)按钮设置边框实例

随机推荐

  1. js判断手机系统类型
  2. android 广播 service
  3. Android(安卓)软键盘顶起布局相关
  4. android定时滚动
  5. Android 中TextView部分文字颜色、点击跳
  6. 修改块 - 单元测试
  7. Android Get Network Type获得网络类型
  8. Android(安卓)Studio 下获取应用的数字签
  9. Android Audio Subsystem - AudioTrack -
  10. android 属性动画源码分析