Android游戏开发之单点触摸与多点触摸的响应方式
游戏开发中的触摸事件

在游戏开发中监听屏幕触摸事件须要在View中重写父类onTouchEvent方法,在重写的方法中拦截用户触摸屏幕的一些信息,比如触摸屏幕的X 、 Y坐标 触摸屏幕发生的事件 触摸按下  触摸抬起  触摸移动,触摸屏幕发生的时间 等等, 我们先看看onTouchEvent的函数原型。

函数中的Event 参数的意思为当前触摸事件的对象,这个对象中包含着当前触摸事件的一切信息。比如ecent.getAction()可以拿到当前触摸事件的名称,根据触摸事件的名称可以判断当前是触摸按下 还是 触摸移动 还是 触摸抬起。 event.getX()与 event.getY()可以拿到当前触摸屏幕的X Y坐标。event.getEventTime(); 可以拿到当前触发触摸事件的时间,等等所有的信息。

  1. @Override
  2. public boolean onTouchEvent(MotionEvent event) {
  3. int action = event.getAction();
  4. mPosX = (int) event.getX();
  5. mPosY = (int) event.getY();
  6. switch (action) {
  7. // 触摸按下的事件
  8. case MotionEvent.ACTION_DOWN:
  9. Log.v(“test”, “ACTION_DOWN”);
  10. break;
  11. // 触摸移动的事件
  12. case MotionEvent.ACTION_MOVE:
  13. Log.v(“test”, “ACTION_MOVE”);
  14. break;
  15. // 触摸抬起的事件
  16. case MotionEvent.ACTION_UP:
  17. Log.v(“test”, “ACTION_UP”);
  18. break;
  19. }
  20. //            return super.onTouchEvent(event);
  21. return true;
  22. }

复制代码

这个函数是具有有返回值的,须要返回一个布尔值。大家发现我将return super.onTouchEvent(event)注释掉了而是直接return ture。 我给同学们解释一下为什么要着么操作。onTouchEvent方法不是我们手动调用的而是系统调用的 它的返回值会直接通知系统是否回调方法。如果说在这里return false  onTouchEvent方法永远不会在被回调也就是说它只能响应触摸按下操作,触摸移动事件 和触摸抬起事件永远都不会在被响应 ,log只会打印出”ACTION_DOWN”。 如果这里return super.onTouchEvent(event); 调用父类的方法来得到返回值返回 ,这样也是有问题的因为调用父类的onTouchEvent方法可能也会返回false 这样一来依然会无法响应触摸移动事件和触摸抬起事件。所以为了正确的处理触摸事件在这里我们直接return ture 这样一来就万无一失了,Log中会将所有信息都打印出来。

1.单点触摸

在下面这个DEMO中 用手触摸 移动 屏幕后 下面的icon图片会跟随这我的手势移动。 代码实现主要是在onTouchEvent方法中时时去计算手触摸屏幕各个状态的坐标 然后调用 postInvalidate(); 方法去通知UI刷新屏幕重新显示图片 文字的位置以及内容。 具体相关内容见Android游戏开发之构建游戏框架View与SurFaceView的区别(五)

  1. import android.app.Activity;
  2. import android.content.Context;
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapFactory;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.Paint;
  8. import android.os.Bundle;
  9. import android.util.Log;
  10. import android.view.MotionEvent;
  11. import android.view.View;
  12. public class ViewActivity extends Activity {
  13. @Override
  14. public void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(new MyView(this));
  17. }
  18. public class MyView extends View {
  19. /** 触摸后绘制的图片 **/
  20. Bitmap mBitmap = null;
  21. /** 游戏画笔 **/
  22. Paint mPaint = null;
  23. /** 触摸后在屏幕中显示的位置 **/
  24. int mPosX = 0;
  25. int mPosY = 0;
  26. /**事件触发时间**/
  27. Long mActionTime = 0L;
  28. public MyView(Context context) {
  29. super(context);
  30. /** 设置当前View拥有控制焦点 **/
  31. this.setFocusable(true);
  32. /** 设置当前View拥有触摸事件 **/
  33. this.setFocusableInTouchMode(true);
  34. /** 加载图片 **/
  35. mBitmap = BitmapFactory.decodeResource(getResources(),
  36. R.drawable.item);
  37. mPaint = new Paint();
  38. mPaint.setColor(Color.WHITE);
  39. }
  40. @Override
  41. protected void onDraw(Canvas canvas) {
  42. /** 绘制图片 **/
  43. canvas.drawBitmap(mBitmap, mPosX, mPosY, mPaint);
  44. canvas.drawText(“当前X坐标:”+mPosX, 0, 20, mPaint);
  45. canvas.drawText(“当前Y坐标:”+mPosY, 0, 40, mPaint);
  46. canvas.drawText(“事件触发时间:”+mActionTime, 0, 60, mPaint);
  47. super.onDraw(canvas);
  48. }
  49. @Override
  50. public boolean onTouchEvent(MotionEvent event) {
  51. int action = event.getAction();
  52. mPosX = (int) event.getX();
  53. mPosY = (int) event.getY();
  54. switch (action) {
  55. // 触摸按下的事件
  56. case MotionEvent.ACTION_DOWN:
  57. Log.v(“test”, “ACTION_DOWN”);
  58. break;
  59. // 触摸移动的事件
  60. case MotionEvent.ACTION_MOVE:
  61. Log.v(“test”, “ACTION_MOVE”);
  62. break;
  63. // 触摸抬起的事件
  64. case MotionEvent.ACTION_UP:
  65. Log.v(“test”, “ACTION_UP”);
  66. break;
  67. }
  68. /**得到事件触发时间**/
  69. mActionTime = event.getEventTime();
  70. /** 通知UI线程刷新屏幕 **/
  71. postInvalidate();
  72. // return super.onTouchEvent(event);
  73. return true;
  74. }
  75. }
  76. }

复制代码

2.多点触摸

由于模拟器只能用鼠标点击一个点 无法模拟多点触摸,所以我用真机来调试多点触摸。下面这张图是我用豌豆荚在真机中截的图,此时我两只手指正在手机屏幕中触摸移动。界面中正确的根据我的手势来移动图片以及显示的内容。这里强调一下多点触摸并不是所有手机都支持 有些手机支持很多点有些手机可能只支持单点。就那我的手机来说只支持两点触摸。所以无论我用多少根手指头在我的手机屏幕上比划 也只会出现2个触摸点,如下图所示。

下面我们详细的说一下代码的实现方式,多点触摸和单点触摸一样都是在onTouchEvent中去监听触摸事件。调用方法event.getPointerCount(); 可以拿到当前屏幕同时触摸点的数量 以我的手机为例因为只支持两点触摸所以在我的手机上调用该方法最多只会返回2。 拿到了触摸屏幕点的数量以后 可以使用for循环来遍历当前屏幕的所有触摸点,调用event.getX(i); 与 event.getY(i); 方法 将ID作为参数传入会得到每个点在屏幕中显示的X Y坐标值。最后根据坐标值将图片与内容绘制在手机屏幕中。

  1. import android.app.Activity;
  2. import android.content.Context;
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapFactory;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.Paint;
  8. import android.os.Bundle;
  9. import android.util.Log;
  10. import android.view.MotionEvent;
  11. import android.view.SurfaceHolder;
  12. import android.view.SurfaceView;
  13. import android.view.Window;
  14. import android.view.WindowManager;
  15. import android.view.SurfaceHolder.Callback;
  16. public class SurfaceViewAcitvity extends Activity {
  17. MyView mAnimView = null;
  18. @Override
  19. public void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. // 全屏显示窗口
  22. requestWindowFeature(Window.FEATURE_NO_TITLE);
  23. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  24. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  25. // 显示自定义的游戏View
  26. mAnimView = new MyView(this);
  27. setContentView(mAnimView);
  28. }
  29. public class MyView extends SurfaceView implements Callback {
  30. /** 触摸后绘制的图片 **/
  31. Bitmap mBitmap = null;
  32. /** 游戏画笔 **/
  33. Paint mPaint = null;
  34. SurfaceHolder mSurfaceHolder = null;
  35. /** 控制游戏更新循环 **/
  36. boolean mRunning = false;
  37. /** 游戏画布 **/
  38. Canvas mCanvas = null;
  39. public MyView(Context context) {
  40. super(context);
  41. /** 设置当前View拥有控制焦点 **/
  42. this.setFocusable(true);
  43. /** 设置当前View拥有触摸事件 **/
  44. this.setFocusableInTouchMode(true);
  45. /** 加载图片 **/
  46. mBitmap = BitmapFactory.decodeResource(getResources(),
  47. R.drawable.item);
  48. /** 拿到SurfaceHolder对象 **/
  49. mSurfaceHolder = this.getHolder();
  50. /** 将mSurfaceHolder添加到Callback回调函数中 **/
  51. mSurfaceHolder.addCallback(this);
  52. /** 创建画布 **/
  53. mCanvas = new Canvas();
  54. /**创建画笔**/
  55. mPaint = new Paint();
  56. mPaint.setColor(Color.WHITE);
  57. }
  58. @Override
  59. public boolean onTouchEvent(MotionEvent event) {
  60. /** 拿到触摸的状态 **/
  61. int action = event.getAction();
  62. /** 控制当触摸抬起时清屏 **/
  63. boolean reset = false;
  64. switch (action) {
  65. // 触摸按下的事件
  66. case MotionEvent.ACTION_DOWN:
  67. Log.v(“test”, “ACTION_DOWN”);
  68. break;
  69. // 触摸移动的事件
  70. case MotionEvent.ACTION_MOVE:
  71. Log.v(“test”, “ACTION_MOVE”);
  72. break;
  73. // 触摸抬起的事件
  74. case MotionEvent.ACTION_UP:
  75. Log.v(“test”, “ACTION_UP”);
  76. reset = true;
  77. break;
  78. }
  79. // 在这里加上线程安全锁
  80. synchronized (mSurfaceHolder) {
  81. /** 拿到当前画布 然后锁定 **/
  82. mCanvas = mSurfaceHolder.lockCanvas();
  83. /** 清屏 **/
  84. mCanvas.drawColor(Color.BLACK);
  85. if (!reset) {
  86. /** 在屏幕中拿到同时触碰的点的数量 **/
  87. int pointCount = event.getPointerCount();
  88. /** 使用循环将每个触摸点图片都绘制出来 **/
  89. for (int i = 0; i < pointCount; i++) {
  90. /** 根据触摸点的ID 可以讲每个触摸点的X Y坐标拿出来 **/
  91. int x = (int) event.getX(i);
  92. int y = (int) event.getY(i);
  93. int showX = i * 150;
  94. mCanvas.drawBitmap(mBitmap, x, y, mPaint);
  95. mCanvas.drawText(“当前X坐标:”+x, showX, 20, mPaint);
  96. mCanvas.drawText(“当前Y坐标:”+y, showX, 40, mPaint);
  97. mCanvas.drawText(“事件触发时间:”+event.getEventTime(), showX, 60, mPaint);
  98. }
  99. }else {
  100. mCanvas.drawText(“请多点触摸当前手机屏幕” ,0, 20, mPaint);
  101. }
  102. /** 绘制结束后解锁显示在屏幕上 **/
  103. mSurfaceHolder.unlockCanvasAndPost(mCanvas);
  104. }
  105. // return super.onTouchEvent(event);
  106. return true;
  107. }
  108. @Override
  109. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  110. int height) {
  111. }
  112. @Override
  113. public void surfaceCreated(SurfaceHolder holder) {
  114. }
  115. @Override
  116. public void surfaceDestroyed(SurfaceHolder holder) {
  117. }
  118. }
  119. }

复制代码

Android游戏开发之单点触摸与多点触摸相关推荐

  1. Android游戏开发Android软件开发【教程三十篇】

    Android软件开发之发送短信与系统短信库解析(三十)  New Android软件开发之获取通讯录联系人信息(二十九)  New Android软件开发之PreferenceActivity中的组 ...

  2. Android游戏开发中绘制游戏触摸轨迹的曲线图

    本篇文章主要来讲解怎样绘制游戏触摸轨迹的曲线图. 我们在onTouchEvent方法中,可以获取到触摸屏幕时手指触摸点的x.y坐标,如何用这些点形成一条无规则轨迹并把这条无规则轨迹曲线显示在屏幕上就是 ...

  3. libgdx教程_使用libgdx进行Android游戏开发–一天中的原型,第1b部分

    libgdx教程 创造游戏并展现世界 要将世界渲染到屏幕上,我们需要为其创建一个屏幕,并告诉它渲染世界. 在libgdx中,有一个名为Game的便利类,我们将把StarAssault类重写为StarA ...

  4. Android游戏开发实践指南(华章程序员书库)

    <Android游戏开发实践指南(华章程序员书库)> 基本信息 原书名:Learning Android Game Programming:A Hands-On Guide to Buil ...

  5. 《Android游戏开发详解》一导读

    前 言 Android游戏开发详解 作为对编程知之甚少或者毫无所知的初学者,开始学习Android游戏开发,可能会觉得就像是穿越陌生的星际的旅程.有太多的事情要尝试,太多的知识要学习,令人遗憾的是,还 ...

  6. 《Android游戏开发详解》一2.2 设置开发机器

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.2节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区 ...

  7. Android游戏开发起步(译文)

    英文 http://dev.chinamobile.com/cmdn/bbs/thread-13718-1-1.html 如果你有兴趣为Android平台开发游戏,有很多你需要了解的东西.我是Ligh ...

  8. Android游戏开发–粒子爆炸

    有没有想过爆炸是如何产生的? 让我们绕个弯路,尝试实现基本的粒子爆炸. 爆炸不过是一堆散布在屏幕上的,源自单个点的粒子(无论是像素,小形状还是图像). 为了方便起见,并非总是如此,而是为了简洁起见,我 ...

  9. Android游戏开发-布局管理

    Android游戏开发-布局管理 2012/5/16 星期三 下午   我们都知道,系统控件一般都会搭载进布局里的,在Android呢,提供了5种布局类型,通过这五种布局之间的相互组合可以构建各种复杂 ...

最新文章

  1. .net实现跨页面传值
  2. Linux服务管理---系统运行级别、rpm启动与自启动、源码包的启动...
  3. resource id 3 php,PHP Warning: stat(): stat failed for Resource id
  4. 我的秋招之路之c++中static的用法
  5. 《民国枭雄杜月笙》—— 听后总结
  6. linux笔记:shell基础-bash基本功能
  7. linux版本的edge多网页标签(tag)不见了咋办
  8. Golang——流程控制语句、跳转控制语句细节
  9. phpstudy创建wordpress
  10. xwpftemplate的时间设置_数据导出生成word附件使用POI的XWPFTemplate对象
  11. VS2013代码调试:[7]如何避免调试时加载符号
  12. java system datetime_Java8新特性时间日期库DateTime API及示例
  13. 概率论与数理统计(第四版) 课后习题解析 盛骤、谢式千 编|高等教育出版社 大学课后习题答案
  14. vue下载文件流图片
  15. Talk预告 | 中国科学技术大学和微软亚洲研究院联合培养博士生冷燚冲:语音识别的快速纠错模型FastCorrect
  16. gavin中文是什么意思_Gavin[加文,盖温]的中文翻译及英文名意思
  17. Ant-Table查看详情
  18. keygen是怎么写出来的。
  19. HTML5期末大作业:电影网站设计——电影资讯博客(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 web学生网页设计作业源码
  20. 基于Python的GUI图形用户界面编程

热门文章

  1. 随机生成区间范围的整数(含负数)
  2. dplyr包功能(数据清理、过滤、合并R实现)
  3. 百合类游戏推荐その花びらにくちづけを花吻在上
  4. win10 pycharm破解
  5. 综述:智能城市的车联网部署:应用、架构和挑战
  6. Paper---CNN调参论文参考
  7. 步进电机不知道线序颜色的情况下如何区分线序
  8. java用drawline画血条,Java小项目之坦克大战单机1.0版
  9. 计算机网络华为路由器配置实验,计算机网络 路由器基本命令操作实验报告格式 华为.doc...
  10. ubuntu开机后经常提示:检测到系统程序出现问题