同绘图一样, View 也是通过回调函数来响应用户事件的。键盘事件的回调函数有多个,以对应不同的事件,我们暂时只用到 onKeyDown ,对应按键被按下的事件,其他函数以后用到再介绍。让我们重载 onKeyDown (重载一个函数的方法前面章节有介绍)
  @Override
  public boolean onKeyDown( int keyCode, KeyEvent event) {
  // TODO Auto-generated method stub
  return super .onKeyDown(keyCode, event);
  }
  onKeyDown 有两个参数: keyCode 和 event ,通过 keyCode 能判断是哪个键被按下, event 比较复杂,包含了这次按键更多的信息,我们暂时先不考虑它。
  现在我们要通过按键控制主角向四个方向移动。所谓移动,就是将主角的图像在不同的位置显示出来,也就是改变函数 drawBitmap 中的第二、第三个参数。比如用户按下右方向键,我们就把横坐标增加,这样下次显示出来的时候,主角就会往右一点。为了节约时间,我们就把刚刚显示的图片 BattleCity 作为主角好了。首先定义两个全局变量 x 和 y ,然后在 onKeyDown 中改变 x 、 y 的值,然后重绘 View 。因为代码没有什么难度,所以不做讲解了。
  public class GameView extends View {
  int x =0, y =0;
  ……
  @Override
  protected void onDraw(Canvas canvas) {
  ……
  canvas.drawBitmap( bmp , x , y , new Paint());
  }
  @Override
  public boolean onKeyDown( int keyCode, KeyEvent event) {
  // TODO Auto-generated method stub
  switch (keyCode) {
  case KeyEvent. KEYCODE_DPAD_UP :
  y -= 10;
  break ;
  case KeyEvent. KEYCODE_DPAD_DOWN :
  y += 10;
  break ;
  case KeyEvent. KEYCODE_DPAD_LEFT :
  x -= 10;
  break ;
  case KeyEvent. KEYCODE_DPAD_RIGHT :
  x += 10;
  break ;
  }
  postInvalidate(); // 通知系统重绘 View

======黑软基地手机资讯频道======
  
  return super .onKeyDown(keyCode, event);
  }
  }
  完成后我们肯定很想测试一下,但是此时你会发现,按键根本没有任何反应。这就是我们要特殊指出的地方。 View 被显示时,缺省情况下没有获得焦点,就是说,按键动作没有发送给 View ,所以需要在构造函数中增加一句
  public GameView(Context context) {
  ……
  setFocusable( true );
  }
  再运行程序,看看图片是否按照我们的指令运动起来了。
  前面说过,很多手机没有硬键盘,所以我们需要一个软键盘的解决方案。软键盘就是在屏幕上显示一个键盘,然后响应用户的触摸屏操作,模拟成键盘操作。对于坦克大战,我们只需要在屏幕上显示一个模拟的游戏手柄(显示图片的方法大家没有忘记吧,显示位置可以根据模拟器自行调整):

  在用户触摸模拟手柄上的方向键和开火键时进行相应的操作。我们拿方向键做演示,步骤如下:首先确定四个方向键在屏幕上的区域(上图的红色方框),然后在触摸屏事件的响应函数中判断事件是否发生在方向键区域中,最后如果事件发生在区域中进行相应的操作。
  下面,我们引入一个非常有用的类 Rect ( RectF 与 Rect 基本相同,不过以 float 作为坐标参数), rect 是 rectangle 的简写,顾名思义,这个类代表了一个矩形。 Rect 通过矩形 4 个边来定义这个矩形的范围。他们分别是 left , right , top , bottom ,如图所示:

  转化为屏幕坐标, top 是矩形坐上角的纵坐标, left 是矩形坐上角的横坐标, right 是矩形右下角的横坐标, buttom 是右下角的纵坐标。有了 Rect 我们就可以方便的表示虚拟手柄各个键的位置。同时 Rect 还提供了一些很有用的函数,其中 Rect.contains(x, y) 能够判断点 (x, y) 是否在矩形框中,正好是我们需要的。
  现在我们就可以开始编码了,首先为虚拟键盘的方向键创建 Rect (可以用绘图工具测量坐标):
  Rect rKeyUp = new Rect(56,290,86,320);
  Rect rKeyDown = new Rect(56, 350, 86, 380);
  Rect rKeyLeft = new Rect(26, 320, 56, 350);

======黑软基地手机资讯频道======
  
  Rect rKeyRight = new Rect(86, 320, 116, 350);
  然后重载触摸屏响应函数:
  @Override
  public boolean onTouchEvent(MotionEvent arg0) {
  // TODO Auto-generated method stub
  return super .onTouchEvent(arg0);
  }
  下面我们要做的是,首先判断触摸屏操作是不是按下,如果是,取得坐标( x , y ),然后判断坐标所在的按键,做出相应的操作
  @Override
  public boolean onTouchEvent(MotionEvent arg0) {Auto-generated method stub
  if (arg0.getAction() == MotionEvent. ACTION_DOWN ) {
  int ax = ( int ) arg0.getX();
  int ay = ( int ) arg0.getY();
  if ( rKeyUp .contains(ax, ay)) {
  y -= 10;
  } else if ( rKeyDown .contains(ax, ay)) {
  y += 10;
  } else if ( rKeyLeft .contains(ax, ay)) {
  x -= 10;
  } else if ( rKeyRight .contains(ax, ay)) {
  x += 10;
  }
  postInvalidate(); // 不要忘记刷新屏幕
  }
  return super .onTouchEvent(arg0);
  }
  现在让我们运行一下,每次用鼠标点击模拟手柄的方向键,图片就会移动

转载于:https://www.cnblogs.com/hmyprograming/archive/2012/03/23/2414156.html

Android 响应用户事件的方法相关推荐

  1. Android延时执行事件的方法

    概述 为了让用户体验更好,有些事件需要等一等再执行,或者有时候需要稍后自动隐藏,或者是为了关闭服务能够彻底而不至于重启时有些命令还没跑完等,总之延时执行的用处还是挺大的. 下面是几种常用的延时执行的方 ...

  2. 为什么属性动画移动一个控件后,目标位置仍然能响应用户事件?

    原始网页直通车 这个问题,换句话描述就是:一个 view 在应用了属性动画后,该 view 在新的位置仍然能正确的收到分派的事件. 我们知道, view 调用 translationXX 方法后,虽然 ...

  3. Android成长日记-Android监听事件的方法

    1. Button鼠标点击的监听事件 --setOnClickListener 2. CheckBox, ToggleButton , RadioGroup的改变事件 --setOnCheckedCh ...

  4. 微信小程序开发系列五:微信小程序中如何响应用户输入事件

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...

  5. 一种 Android 用户事件的自适应分发方法

    Android 设备的远程操作控制中,用户可以在控制端看到远程 Android 设备的屏幕,并通过在控制端执行操作,控制远端 Android 上应用程序及系统的行为.控制端可以是任意的系统及平台,如 ...

  6. hitTest和pointInside如何响应用户点击事件

    hitTest和pointInside如何响应用户点击事件 处理机制 iOS事件处理,首先应该是找到能处理点击事件的视图,然后在找到的这个视图里处理这个点击事件. 处理原理如下: • 当用户点击屏幕时 ...

  7. android listview ontouchlistener,Android ListView监听滑动事件的方法(详解)

    ListView的主要有两种滑动事件监听方法,OnTouchListener和OnScrollListener 1.OnTouchListener OnTouchListener方法来自View中的监 ...

  8. android跨进程事件注入(程序模拟用户输入)

    转载请注明出处 早想写这篇,一直没空,现在总结下. 需求: 需要在程序内模拟用户输入,比如点击屏幕,或者输入键盘.模拟用户的滑动等.具体的需求,比如测试的时候,测试打开浏览器1000次.或者通过网络发 ...

  9. android 按键用户点击事件,Android按键事件处理过程详解

    Android按键事件处理过程详解 (2013-09-26 14:05:19) 标签: it 在Android系统中,存在多种界面事件,如点击事件.触摸事件.焦点事件和菜单事件等,在这些界面事件发生时 ...

最新文章

  1. iphone导出照片到电脑_如何更改 iPhone 照片格式?
  2. python画曲线-利用python画出AUC曲线的实例
  3. 关于.NET参数传递方式的思考
  4. 修改服务器mysql密码,修改Linux服务器中的MySql密码
  5. zipentry压缩乱码linux,java生成压缩文件 ZipEntry出现乱码的有关问题
  6. DirectShow 在VS2005中环境配置
  7. (36)System Verilog类中方法示例
  8. leetcode 189. 旋转数组(Rotate Array)
  9. NERO8.3.6.0(官方完整版+序列号)
  10. 网络监测用计算机安全管理制度,计算机信息网络安全管理制度
  11. Android性能优化之图片优化
  12. 宋维刚老师词霸天下38000词汇思维导图
  13. IPAM——IP地址管理
  14. 算法设计题3.34-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版
  15. ConstraintLayout各种居中设置
  16. 【转载】配置文件 .yml 写法小结
  17. 面向对象程序设计(c++)面试常问——for考研复试面试
  18. 集美大学计算机工程学院学业预警,学业预警
  19. 优启通怎么重装系统win10_i优系统教你怎样把WIN10重装回WIN7(详细版)
  20. 计算机windows7启动不了桌面,Win7启动后不显示桌面的解决方法

热门文章

  1. 学习笔记(01):华为工程师,带你实战C++视频精讲-Day1王桂林老师原创视频-C++函数重载原理...
  2. 2021年西门子杯离散行业自动化电梯比赛东北赛区一等奖程序讲解(3部10层)
  3. 极限唯一性的三种反证法
  4. 0x0软考|网络工程师经验分享之计算机网络基础
  5. geostudio2007破解版使用碰到的问题
  6. 巨微通用无线射频芯片的功能和特点
  7. python识别发票二维码_Python 实现二维码生成和识别
  8. 办公知识分享:如何一次性批量重命名图片?这个方法非常简单
  9. STM32学习心得三十五(上):VS1053实验之RAM测试及正弦测试
  10. xposed插件加固保护方案以及对华为方舟编译器的思考