本篇文章主要来讲解怎样绘制游戏触摸轨迹的曲线图。

我们在onTouchEvent方法中,可以获取到触摸屏幕时手指触摸点的x、y坐标,如何用这些点形成一条无规则轨迹并把这条无规则轨迹曲线显示在屏幕上就是本篇文章的主旨内容。

Android Path类

Android提供了一个Path类 , 顾名思义这个类可以设置曲线路径轨迹。任何无规则的曲线实际上都是由若干条线段组成,而线段的定义为两点之间最短的一条线。path类就 可以记录这两点之间的轨迹,那么若干个Path 就是我们须要绘制的无规则曲线。

下面介绍一下API 中path类设置轨迹路径的方法。

public class

Path
       extends Object
       java.lang.Object
       android.graphics.Path

quadTo(float x1, float y1, float x2, float y2)
       Add a quadratic bezier from the last point, approaching control point (x1,y1), and ending at (x2,y2).

解释:

参数1 轨迹起始点X坐标

参数2 轨迹起始点Y坐标

参数3 轨迹结束点X坐标

参数4 轨迹结束点Y坐标

所以根据这个参数就可以设置一条线段轨迹。

分步讲解

为了设置一条比较圆滑好看的曲线我们需要对游戏画笔进行一些设置。注释已经在代码中写的很清楚了,在这里我详细说一下 设置画笔风格  mPaint.setStyle(Paint.Style.STROKE); 意思是设置画笔的风格 android 画笔一共提供了三种风格Paint.Style.STROKE 、Paint.Style.FILL、Paint.Style.FILL_AND_STROKE 意思分别为 空心 、实心、实心与空心 。如果不设置的话默认为 Paint.Style.FILL,在这里必须设置成空心。因为如果一旦设置成实心或者实心与空心那么画笔会把path路径中间包住这样就不是曲线线段了,所以大家注意一下这里。

Java代码

  1. /** 创建曲线画笔 **/
  2. mPaint = new Paint();
  3. mPaint.setColor(Color.BLACK);
  4. /**设置画笔抗锯齿**/
  5. mPaint.setAntiAlias(true);
  6. /**画笔的类型**/
  7. mPaint.setStyle(Paint.Style.STROKE);
  8. /**设置画笔变为圆滑状**/
  9. mPaint.setStrokeCap(Paint.Cap.ROUND);
  10. /**设置线的宽度**/
  11. mPaint.setStrokeWidth(5);

在触摸按下事件中 通过moveTo() 方法设置触摸屏幕点为轨迹的起始点,这样在触摸移动事件中设置曲线的轨迹 起始点为上次触摸点 结束点为本次触摸点。使用quadTo方法记录每次移动产生的一个曲线线段 然后将所有的曲线线段绘制在屏幕中,如果触摸抬起将调用reset()方法重置曲线轨迹。

Java代码

  1. @Override
  2. public boolean onTouchEvent(MotionEvent event) {
  3. /** 拿到触摸的状态 **/
  4. int action = event.getAction();
  5. float x = event.getX();
  6. float y = event.getY();
  7. switch (action) {
  8. // 触摸按下的事件
  9. case MotionEvent.ACTION_DOWN:
  10. /**设置曲线轨迹起点 X Y坐标**/
  11. mPath.moveTo(x, y);
  12. break;
  13. // 触摸移动的事件
  14. case MotionEvent.ACTION_MOVE:
  15. /**设置曲线轨迹**/
  16. //参数1 起始点X坐标
  17. //参数2 起始点Y坐标
  18. //参数3 结束点X坐标
  19. //参数4 结束点Y坐标
  20. mPath.quadTo(mposX, mposY, x, y);
  21. break;
  22. // 触摸抬起的事件
  23. case MotionEvent.ACTION_UP:
  24. /**按键抬起后清空路径轨迹**/
  25. mPath.reset();
  26. break;
  27. }
  28. //记录当前触摸X Y坐标
  29. mposX = x;
  30. mposY = y;
  31. return true;
  32. }

游戏绘制中调用drawPath方法将onTouchEvent中记录的路径曲线绘制在屏幕当中。

Java代码

  1. private void Draw() {
  2. /**清空画布**/
  3. mCanvas.drawColor(Color.WHITE);
  4. /**绘制曲线**/
  5. mCanvas.drawPath(mPath, mPaint);
  6. /**记录当前触点位置**/
  7. mCanvas.drawText("当前触笔 X:" + mposX, 0, 20,mTextPaint);
  8. mCanvas.drawText("当前触笔 Y:" + mposY, 0, 40,mTextPaint);
  9. }

代码的整体实现

详细的论坛注释已经在代码中写出 欢迎大家阅读喔 哇咔咔~~~~

Java代码

  1. import android.app.Activity;
  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.Color;
  5. import android.graphics.Paint;
  6. import android.graphics.Path;
  7. import android.os.Bundle;
  8. import android.view.MotionEvent;
  9. import android.view.SurfaceHolder;
  10. import android.view.SurfaceView;
  11. import android.view.Window;
  12. import android.view.WindowManager;
  13. import android.view.SurfaceHolder.Callback;
  14. public class SurfaceViewAcitvity extends Activity {
  15. MyView mAnimView = null;
  16. @Override
  17. public void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. // 全屏显示窗口
  20. requestWindowFeature(Window.FEATURE_NO_TITLE);
  21. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  22. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  23. // 显示自定义的游戏View
  24. mAnimView = new MyView(this);
  25. setContentView(mAnimView);
  26. }
  27. public class MyView extends SurfaceView implements Callback,Runnable {
  28. /**每50帧刷新一次屏幕**/
  29. public static final int TIME_IN_FRAME = 50;
  30. /** 游戏画笔 **/
  31. Paint mPaint = null;
  32. Paint mTextPaint = null;
  33. SurfaceHolder mSurfaceHolder = null;
  34. /** 控制游戏更新循环 **/
  35. boolean mRunning = false;
  36. /** 游戏画布 **/
  37. Canvas mCanvas = null;
  38. /**控制游戏循环**/
  39. boolean mIsRunning = false;
  40. /**曲线方向**/
  41. private Path mPath;
  42. private float mposX, mposY;
  43. public MyView(Context context) {
  44. super(context);
  45. /** 设置当前View拥有控制焦点 **/
  46. this.setFocusable(true);
  47. /** 设置当前View拥有触摸事件 **/
  48. this.setFocusableInTouchMode(true);
  49. /** 拿到SurfaceHolder对象 **/
  50. mSurfaceHolder = this.getHolder();
  51. /** 将mSurfaceHolder添加到Callback回调函数中 **/
  52. mSurfaceHolder.addCallback(this);
  53. /** 创建画布 **/
  54. mCanvas = new Canvas();
  55. /** 创建曲线画笔 **/
  56. mPaint = new Paint();
  57. mPaint.setColor(Color.BLACK);
  58. /**设置画笔抗锯齿**/
  59. mPaint.setAntiAlias(true);
  60. /**画笔的类型**/
  61. mPaint.setStyle(Paint.Style.STROKE);
  62. /**设置画笔变为圆滑状**/
  63. mPaint.setStrokeCap(Paint.Cap.ROUND);
  64. /**设置线的宽度**/
  65. mPaint.setStrokeWidth(5);
  66. /**创建路径对象**/
  67. mPath = new Path();
  68. /** 创建文字画笔 **/
  69. mTextPaint = new Paint();
  70. /**设置颜色**/
  71. mTextPaint.setColor(Color.BLACK);
  72. /**设置文字大小**/
  73. mTextPaint.setTextSize(15);
  74. }
  75. @Override
  76. public boolean onTouchEvent(MotionEvent event) {
  77. /** 拿到触摸的状态 **/
  78. int action = event.getAction();
  79. float x = event.getX();
  80. float y = event.getY();
  81. switch (action) {
  82. // 触摸按下的事件
  83. case MotionEvent.ACTION_DOWN:
  84. /**设置曲线轨迹起点 X Y坐标**/
  85. mPath.moveTo(x, y);
  86. break;
  87. // 触摸移动的事件
  88. case MotionEvent.ACTION_MOVE:
  89. /**设置曲线轨迹**/
  90. //参数1 起始点X坐标
  91. //参数2 起始点Y坐标
  92. //参数3 结束点X坐标
  93. //参数4 结束点Y坐标
  94. mPath.quadTo(mposX, mposY, x, y);
  95. break;
  96. // 触摸抬起的事件
  97. case MotionEvent.ACTION_UP:
  98. /**按键抬起后清空路径轨迹**/
  99. mPath.reset();
  100. break;
  101. }
  102. //记录当前触摸X Y坐标
  103. mposX = x;
  104. mposY = y;
  105. return true;
  106. }
  107. private void Draw() {
  108. /**清空画布**/
  109. mCanvas.drawColor(Color.WHITE);
  110. /**绘制曲线**/
  111. mCanvas.drawPath(mPath, mPaint);
  112. /**记录当前触点位置**/
  113. mCanvas.drawText("当前触笔 X:" + mposX, 0, 20,mTextPaint);
  114. mCanvas.drawText("当前触笔 Y:" + mposY, 0, 40,mTextPaint);
  115. }
  116. @Override
  117. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  118. int height) {
  119. }
  120. @Override
  121. public void surfaceCreated(SurfaceHolder holder) {
  122. /**开始游戏主循环线程**/
  123. mIsRunning = true;
  124. new Thread(this).start();
  125. }
  126. @Override
  127. public void surfaceDestroyed(SurfaceHolder holder) {
  128. mIsRunning = false;
  129. }
  130. @Override
  131. public void run() {
  132. while (mIsRunning) {
  133. /** 取得更新游戏之前的时间 **/
  134. long startTime = System.currentTimeMillis();
  135. /** 在这里加上线程安全锁 **/
  136. synchronized (mSurfaceHolder) {
  137. /** 拿到当前画布 然后锁定 **/
  138. mCanvas = mSurfaceHolder.lockCanvas();
  139. Draw();
  140. /** 绘制结束后解锁显示在屏幕上 **/
  141. mSurfaceHolder.unlockCanvasAndPost(mCanvas);
  142. }
  143. /** 取得更新游戏结束的时间 **/
  144. long endTime = System.currentTimeMillis();
  145. /** 计算出游戏一次更新的毫秒数 **/
  146. int diffTime = (int) (endTime - startTime);
  147. /** 确保每次更新时间为50帧 **/
  148. while (diffTime <= TIME_IN_FRAME) {
  149. diffTime = (int) (System.currentTimeMillis() - startTime);
  150. /** 线程等待 **/
  151. Thread.yield();
  152. }
  153. }
  154. }
  155. }
  156. }

看懂并掌握了这些代码实例后,相信大家对如何绘制游戏触摸轨迹的曲线图有了方法上的认识了,希望大家在Android游戏开发中自如的运用它们。

Android游戏开发中绘制游戏触摸轨迹的曲线图相关推荐

  1. 【iphone游戏开发】Iphone游戏开发之五:游戏场景切换,点阵字的实现和Hiero工具的利用

    Andy--清风 原创,转载请注明,谢谢 一.游戏场景切换 在iPhone游戏开发中,游戏之间的场景开发中有很多动画可以实现,具体实现的动画如下: CCTransitionRotoZoom//从大到小 ...

  2. 【Android游戏开发之八】游戏中添加音频-详解MediaPlayer与SoundPool的利弊以及各个在游戏中的用途!...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/312.html 游 ...

  3. 【Android游戏开发之八】游戏中添加音频-详解MediaPlayer与SoundPoo!并讲解两者的区别和游戏中的用途!...

    为什么80%的码农都做不了架构师?>>>     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigam ...

  4. android 游戏开发中的声音

    游戏开发中,通过资料和书籍了解到在有两种播放音频形式可以用在我们的游戏开发中,第一个:MediaPlayer 类 :第二个:SoundPool 类! PS:当然还有一个JetPlayer 但是 播放的 ...

  5. 【转载】【《Real-Time Rendering 3rd》 提炼总结】(九) 第十章 · 游戏开发中基于图像的渲染技术总结

    本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/78309500 这是一篇近万字的总结式 ...

  6. 游戏开发中,图片资源的精简

    蒙板压缩对比图:(此方法可大幅减小游戏包的大小) 包大小对比: 在游戏开发中,包的大小总是与图片资源的大小密切相关,而图片资源中,大多为带有透明度信息的png图像. 那么,如何精简png图片资源呢? ...

  7. 【《Real-Time Rendering 3rd》 提炼总结】(九) 第十章 · 游戏开发中基于图像的渲染技术总结

    本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/78309500 这是一篇近万字的总结式 ...

  8. 移动端h5游戏开发中的动画和动效展示

    在移动端h5游戏开发中,经常会遇到动画和动效的展现需求,比较常用的实现方法有css3.svg.定时器等,针对不同的场景和需求使用不同的技术,可以提升设计和开发的效率,保证产品的效果和质量,也能让用户有 ...

  9. 游戏开发中的数据表示

    声明:本文内容源自腾讯游戏学院程序公开课_服务端 一.数据表示的基础 什么是数据表示? 数据是信息的载体. 数据表示是一组操作,可以描述.显示.操作信息. 数据表示的要素 IDL - 接口描述语言 I ...

最新文章

  1. matplotlib安装成功但import失败_统信UOS安装失败,deepinv20.1国产操作系统安装成功...
  2. 容器,你还只用Docker吗?(下)
  3. MySQL学习笔记 约束以及修改数据表
  4. android自定义绘制二叉树,安卓数据结构04-二叉树
  5. HDU - 5514 Frogs(容斥原理)
  6. bzoj2957:楼房重建
  7. 程序的图标无法改变_想体验程序猿日常工作的快乐吗?来玩国产烧脑益智游戏《异常》...
  8. ecshop 自动售货 php,ecshop自动分成二次开发实例
  9. 哪些事是考研前不知道,考研后才知道的?
  10. 淘宝评论爬虫python
  11. 日志技术之JUL入门
  12. 基于PaddleOCR开发uni-app离线身份证识别插件
  13. scrapy 抓取拉钩 ajax
  14. 宋宝华Linux培训笔记-Linux多线程
  15. 如何将List集合存入数据库,解决方案
  16. IDEA配置注释模板
  17. 基于Spring Security与JWT实现单点登录
  18. 年轻人,请听我说……
  19. Flink学习4-流式SQL
  20. 俄罗斯电商平台ozon的崛起,卖家可以使用测评补单方式打造爆款吗?

热门文章

  1. oracle测试没响应,Oracle JDBC 没响应,是不是BUG?
  2. mysql数据库模型生成表_PowerDesigner逆向生成MYSQL数据库表结构总结
  3. python celery异步_【Python】Celery异步处理
  4. es6 数组合并_九个前端开发必学超级实用的 ES6 特性
  5. 机器学习-分类算法-线性回归、梯度下降,过拟合欠拟合,岭回归11
  6. 机器学习-特征处理/归一化/标准化/降维03
  7. 限界分支法:01背包问题,优先级队列(包含解的追踪)
  8. 安装python的第一个曲折
  9. 对现代软件工程开发看法
  10. Hihocoder 小Hi小Ho扫雷作死一二三