2024年3月9日发(作者:)

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

戏开发中监听屏幕触摸事件须要在 View 中重写父类 onTouchEvent 方法,在重写

的方法中拦截用户触摸屏幕的一些信息,比如触摸屏幕的 X 、 Y 坐标 触摸屏幕

发生的事件 触摸按下 触摸抬起 触摸移动,触摸屏幕发生的时间 等等, 我们先看

看onTouchEvent 的函数原型。 函数中的 Event 参数的意思为当前触摸事件的对

象,这个对象中包含着当前触摸事件的一切信息。比如 ion可以拿到当

前触摸事件的名称,根据触摸事件的名称可以判断当前是触摸按下 还是 触摸移动

还是 触摸抬起。 与 可以拿到当前触摸屏幕的 X Y 坐标。

ntTime 可以拿到当前触发触摸事件的时间,等等所有的信息。 1.

Override 2. publicbooleanonTouchEventMotionEventevent 3. ion 4.

5. 6. switchaction 7. //触摸按下的事件 8.

_DOWN: 9. CTION_DOWN 10. break 11. //触摸

移动的事件 12. _MOVE: 13. CTION_MOVE 14.

break 15. //触摸抬起的事件 16. _UP: 17.

CTION_UP 18. break 19. 20. //hEventevent 21.

returntrue 22. 复制代码这个函数是具有有返回值的,须要返回一个布尔值。大家发

现我将 hEventevent注释掉了而是直接 return ture。 我给同学们

解释一下为什么要着么操作。onTouchEvent 方法不是我们手动调用的而是系统调用

的 它的返回值会直接通知系统是否回调方法。如果说在这里 return false

onTouchEvent 方法永远不会在被回调也就是说它只能响应触摸按下操作,触摸移动

事件 和触摸抬起事件永远都不会在被响应 ,log 只会打印出ACTION_DOWN。 如

果这里 return hEventevent 调用父类的方法来得到返回值返回 ,这样

也是有问题的因为调用父类的 onTouchEvent 方法可能也会返回 false 这样一来依

然会无法响应触摸移动事件和触摸抬起事件。所以为了正确的处理触摸事件在这里

我们直接 return ture 这样一来就万无一失了,Log 中会将所有信息都打印出来。1.

单点触摸 在下面这个 DEMO 中 用手触摸 移动 屏幕后 下面的 icon 图片会跟

随这我的手势移动。 代码实现主要是在 onTouchEvent 方法中时时去计算手触摸屏

幕各个状态的坐标 然后调用 postInvalidate 方法去通知 UI 刷新屏幕重新显示图

片 文字的位置以及内容。 具体相关内容见 Android 游戏开发之构建游戏框架

View 与 SurFaceView 的区别(五) 1. ty 2.

t 3. 4.

Factory 5. 6.

7. 8.

9. 10.

Event11. 12.13.

publicclassViewActivityextendsActivity14. Override15.

publicvoidonCreateBundlesavedInstanceState16. tesavedInstanceState17.

setContentViewnewMyViewthis18. 19.20. publicclassMyViewextendsView21.22. /触摸

后绘制的图片/23. BitmapmBitmapnull24.25. /游戏画笔/26. PaintmPaintnull27.28. /触

摸后在屏幕中显示的位置/29. intmPosX030. intmPosY031.32. /事件触发时间/33.

LongmActionTime0L34.35. publicMyViewContextcontext36. supercontext37. /设置当

前 View 拥有控制焦点/38. usabletrue39. /设置当前 View 拥有触摸事件

/40. usableInTouchModetrue41. /加载图片/42.

ResourcegetResources43. 44.

mPaintnewPaint45. 46. 47.48. Override49.

protectedvoidonDrawCanvascanvas50. /绘制图片/51.

tmapmBitmapmPosXmPosYmPaint52. xt当前 X 坐标:

mPosX020mPaint53. xt当前 Y 坐标:mPosY040mPaint54.

xt事件触发时间:mActionTime060mPaint55. canvas56.

57.58. Override59. publicbooleanonTouchEventMotionEventevent60.61.

ion62. 63. 64.

switchaction65. //触摸按下的事件66. _DOWN:67.

CTION_DOWN68. break69. //触摸移动的事件70.

_MOVE:71. CTION_MOVE72. break73. //触摸抬

起的事件 74. _UP: 75. CTION_UP 76. break 77.

78. /得到事件触发时间/ 79. ntTime 80. /通知 UI 线程刷新

屏幕/ 81. postInvalidate 82. //hEventevent 83. returntrue 84. 85.

86. 复制代码2.多点触摸 由于模拟器只能用鼠标点击一个点 无法模拟多点触摸,

所以我用真机来调试多点触摸。下面这张图是我用豌豆荚在真机中截的图,此时我

两只手指正在手机屏幕中触摸移动。界面中正确的根据我的手势来移动图片以及显

示的内容。 这里强调一下多点触摸并不是所有手机都支持 有些手机支持很多点有

些手机可能只支持单点。就那我的手机来说只支持两点触摸。所以无论我用多少根

手指头在我的手机屏幕上比划 也只会出现 2 个触摸点,如下图所示。 下面我们详

细的说一下代码的实现方式,多点触摸和单点触摸一样都是在onTouchEvent 中去监

听触摸事件。调用方法 nterCount 可以拿到当前屏幕同时触摸点的数量

以我的手机为例因为只支持两点触摸所以在我的手机上调用该方法最多只会返回

2。 拿到了触摸屏幕点的数量以后 可以使用 for 循环来遍历当前屏幕的所有触摸

点,调用 与 方法 将 ID 作为参数传入会得到每个点在屏

幕中显示的 X Y 坐标值。最后根据坐标值将图片与内容绘制在手机屏幕中。 1.

ty 2. t 3.

4. Factory 5.

6. 7.

8. 9. 10.

Event11. eHolder12.

eView13. 14.

Manager15.

ck16.17.18.

publicclassSurfaceViewAcitvityextendsActivity19.20. MyViewmAnimViewnull21.22.

Override23. publicvoidonCreateBundlesavedInstanceState24.

tesavedInstanceState25. //全屏显示窗口26.

E_NO_TITLE27.

_FULLSCREEN28.

_FULLSCREEN29. //显示自定义的游戏

View30. mAnimViewnewMyViewthis31. setContentViewmAnimView32. 33.34.

publicclassMyViewextendsSurfaceViewimplementsCallback35.36. /触摸后绘制的图片

/37. BitmapmBitmapnull38.39. /游戏画笔/40. PaintmPaintnull41.42.

SurfaceHoldermSurfaceHoldernull43.44. /控制游戏更新循环/45.

booleanmRunningfalse46.47. /游戏画布/48. CanvasmCanvasnull49.50.

publicMyViewContextcontext51. supercontext52. /设置当前 View 拥有控制焦点/53.

usabletrue54. /设置当前 View 拥有触摸事件/55.

usableInTouchModetrue56. /加载图片/57.

ResourcegetResources58. 59. /拿到

SurfaceHolder 对象/60. der61. /将 mSurfaceHolder 添加到

Callback 回调函数中/62. lbackthis63. /创建画布/64.

mCanvasnewCanvas65. /创建画笔/66. mPaintnewPaint67.

68. 69.70. Override71.

publicbooleanonTouchEventMotionEventevent72. /拿到触摸的状态/73.

ion74. /控制当触摸抬起时清屏/75. booleanresetfalse76.

switchaction77. //触摸按下的事件78. _DOWN:79.

CTION_DOWN80. break81. //触摸移动的事件82.

_MOVE:83. CTION_MOVE84. break85. //触摸抬

起的事件86. _UP:87. CTION_UP88. resettrue89.

break90. 91.92. //在这里加上线程安全锁93. synchronizedmSurfaceHolder94. /拿到当

前画布然后锁定/95. nvas96. /清屏/97.

98.99. ifreset100. /在屏幕中拿到同时触碰的点的数

量/101. nterCount102.103.104. /使用循环将每个触摸点图片

都绘制出来/105. forinti0i