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

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

我们在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代码

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

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

Java代码

@Override
public boolean onTouchEvent(MotionEvent event) {
 /** 拿到触摸的状态 **/
 int action = event.getAction();
 float x = event.getX();
 float y = event.getY();
 switch (action) {
 // 触摸按下的事件
 case MotionEvent.ACTION_DOWN:
 /**设置曲线轨迹起点 X Y坐标**/
 mPath.moveTo(x, y);
 break;
 // 触摸移动的事件
 case MotionEvent.ACTION_MOVE:
 /**设置曲线轨迹**/
 //参数1 起始点X坐标
 //参数2 起始点Y坐标
 //参数3 结束点X坐标
 //参数4 结束点Y坐标
 mPath.quadTo(mposX, mposY, x, y);
 break;
 // 触摸抬起的事件
 case MotionEvent.ACTION_UP:
 /**按键抬起后清空路径轨迹**/
 mPath.reset();
 break;
 }
 //记录当前触摸X Y坐标
 mposX = x;
 mposY = y;
 return true;
} 

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

Java代码

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

   代码的整体实现

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

Java代码

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
import android.view.SurfaceHolder.Callback;
public class SurfaceViewAcitvity extends Activity {
 MyView mAnimView = null;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 // 全屏显示窗口
 requestWindowFeature(Window.FEATURE_NO_TITLE);
 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  WindowManager.LayoutParams.FLAG_FULLSCREEN);
 // 显示自定义的游戏View
 mAnimView = new MyView(this);
 setContentView(mAnimView);
 }
 public class MyView extends SurfaceView implements Callback,Runnable {
  /**每50帧刷新一次屏幕**/
 public static final int TIME_IN_FRAME = 50;
 /** 游戏画笔 **/
 Paint mPaint = null;
 Paint mTextPaint = null;
 SurfaceHolder mSurfaceHolder = null;
 /** 控制游戏更新循环 **/
 boolean mRunning = false;
 /** 游戏画布 **/
 Canvas mCanvas = null;
 /**控制游戏循环**/
 boolean mIsRunning = false;
 /**曲线方向**/
 private Path mPath;
 private float mposX, mposY;
 public MyView(Context context) {
  super(context);
  /** 设置当前View拥有控制焦点 **/
  this.setFocusable(true);
  /** 设置当前View拥有触摸事件 **/
  this.setFocusableInTouchMode(true);
  /** 拿到SurfaceHolder对象 **/
  mSurfaceHolder = this.getHolder();
  /** 将mSurfaceHolder添加到Callback回调函数中 **/
  mSurfaceHolder.addCallback(this);
  /** 创建画布 **/
  mCanvas = new Canvas();
  /** 创建曲线画笔 **/
  mPaint = new Paint();
  mPaint.setColor(Color.BLACK);
  /**设置画笔抗锯齿**/
  mPaint.setAntiAlias(true);
  /**画笔的类型**/
  mPaint.setStyle(Paint.Style.STROKE);
  /**设置画笔变为圆滑状**/
  mPaint.setStrokeCap(Paint.Cap.ROUND);
  /**设置线的宽度**/
  mPaint.setStrokeWidth(5);
  /**创建路径对象**/
  mPath = new Path();
  /** 创建文字画笔 **/
  mTextPaint = new Paint();
  /**设置颜色**/
  mTextPaint.setColor(Color.BLACK);
  /**设置文字大小**/
  mTextPaint.setTextSize(15);
 }
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  /** 拿到触摸的状态 **/
  int action = event.getAction();
  float x = event.getX();
  float y = event.getY();
  switch (action) {
  // 触摸按下的事件
  case MotionEvent.ACTION_DOWN:
  /**设置曲线轨迹起点 X Y坐标**/
  mPath.moveTo(x, y);
  break;
  // 触摸移动的事件
  case MotionEvent.ACTION_MOVE:
  /**设置曲线轨迹**/
  //参数1 起始点X坐标
  //参数2 起始点Y坐标
  //参数3 结束点X坐标
  //参数4 结束点Y坐标
  mPath.quadTo(mposX, mposY, x, y);
  break;
  // 触摸抬起的事件
  case MotionEvent.ACTION_UP:
  /**按键抬起后清空路径轨迹**/
  mPath.reset();
  break;
  }
  //记录当前触摸X Y坐标
  mposX = x;
  mposY = y;
  return true;
 }
 private void Draw() {
  /**清空画布**/
  mCanvas.drawColor(Color.WHITE);
  /**绘制曲线**/
  mCanvas.drawPath(mPath, mPaint);
  /**记录当前触点位置**/
  mCanvas.drawText("当前触笔 X:" + mposX, 0, 20,mTextPaint);
  mCanvas.drawText("当前触笔 Y:" + mposY, 0, 40,mTextPaint);
 }
 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
  int height) {
 }
 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  /**开始游戏主循环线程**/
  mIsRunning = true;
  new Thread(this).start();
 }
 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  mIsRunning = false;
 }
 @Override
 public void run() {
  while (mIsRunning) {
  /** 取得更新游戏之前的时间 **/
  long startTime = System.currentTimeMillis();
  /** 在这里加上线程安全锁 **/
  synchronized (mSurfaceHolder) {
   /** 拿到当前画布 然后锁定 **/
   mCanvas = mSurfaceHolder.lockCanvas();
   Draw();
   /** 绘制结束后解锁显示在屏幕上 **/
   mSurfaceHolder.unlockCanvasAndPost(mCanvas);
  }
  /** 取得更新游戏结束的时间 **/
  long endTime = System.currentTimeMillis();
  /** 计算出游戏一次更新的毫秒数 **/
  int diffTime = (int) (endTime - startTime);
  /** 确保每次更新时间为50帧 **/
  while (diffTime <= TIME_IN_FRAME) {
   diffTime = (int) (System.currentTimeMillis() - startTime);
   /** 线程等待 **/
   Thread.yield();
  }
  }
 }
 }
} 

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

以上就是小编对绘制游戏触摸轨迹的曲线图的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

(0)

相关推荐

  • Android 自定义View实现芝麻分曲线图效果

    1.简介 其实这个效果几天之前就写了,但是一直没有更新博客,本来想着把芝麻分雷达图也做好再发博客的,然后今天看到鸿洋的微信公众号有朋友发了芝麻分的雷达图,所以就算了,算是一个互补吧.平时文章也写的比较少,所以可能有点杂乱,有什么需要改进的地方欢迎给出建议,不胜感激. 效果图: 2.步骤: 初始化View的属性 初始化画笔 绘制代表最高分和最低分的两根虚线 绘制文字 绘制代表月份的属性 绘制芝麻分折线 绘制代表芝麻分的圆点 绘制选中分数的悬浮文字以及背景 处理点击事件 3.编码: 初始化View属

  • Android实现价格走势自定义曲线图

    本文是引用开源图表库框架 MPAndroidChart的LineChart 地址:https://github.com/PhilJay/MPAndroidChart 1.需求: (1)动态添加RadioButton,点击改变下面的LineChart数据 (2)LineChart绘制价格走势图,只显示最低点的小圆点和View,手指滑动,MarkView数据变化. (3) 服务端返回端数据,不是每一天端数据,但是x轴显示的必须是每一天的数据,这里是有我自己处理过的.返回里需要显示点的数组,之前的时间

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

    本篇文章主要来讲解怎样绘制游戏触摸轨迹的曲线图. 我们在onTouchEvent方法中,可以获取到触摸屏幕时手指触摸点的x.y坐标,如何用这些点形成一条无规则轨迹并把这条无规则轨迹曲线显示在屏幕上就是本篇文章的主旨内容. Android Path类 Android提供了一个Path类 , 顾名思义这个类可以设置曲线路径轨迹.任何无规则的曲线实际上都是由若干条线段组成,而线段的定义为两点之间最短的一条线.path类就 可以记录这两点之间的轨迹,那么若干个Path 就是我们须要绘制的无规则曲线. 下

  • Android 重力传感器在游戏开发中的应用

    手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,将它们置于游戏当中,大大提升了游戏的可玩性和趣味性.本节将继续介绍智能手机的另一种神奇之处:传感器.    一.何为传感器 所谓传感器就是能够探测如光.热.温度.重力.方向等等的装置.    二.Android提供了哪些传感器 1.加速度传感器(重力传感器) 2.陀螺仪传感器 3.光传感器 4.恒定磁场传感器 5.方向传感器 6.恒定的压力传感器 7.接近传感器 8.温度传感器 今天我们给大家介绍的是游戏开发中最最常见

  • 游戏开发中如何使用CocosCreator进行音效处理

    在游戏开发中,我们经常需要使用音效来营造游戏氛围,因此本文给大家总结下 Cocos Creator 游戏开发中音效组件的封装和使用. 一. Cocos Creator 中音频播放基础 1. 基础知识 [1]AudioSource 组件官方文档:http://docs.cocos.com/creator/manual/zh/audio/audio.html [2]cc.audioEngine官方文档:http://docs.cocos.com/creator/manual/zh/audio/aud

  • Android编程开发中ListView的常见用法分析

    本文实例讲述了Android编程开发中ListView的常见用法.分享给大家供大家参考,具体如下: 一.ListView的使用步骤 ListView的使用通常有以下三个要素: (1)ListView中每个条目的布局; (2)填充进入ListView中的内容; (3)将内容与页面进行整合的Adapter. 因此,使用ListView也通常有以下三个步骤: (1)创建ListView条目的布局文件(或使用Android SDK提供的布局); (2)创建填充进入ListView中的内容,如字符串.图片

  • Unity游戏开发之炸弹人游戏的实现

    目录 前言 制作思路 开始制作 第一步:游戏场景制作 第二步:墙体代码 第三步:炸弹人制作 第四步:炸弹处理 第五步:敌人制作 第六步:游戏控制器 第七步:UI控制器 前言 大家小时候肯定玩过这款游戏,炸弹人也算是经典中的经典啦~ 希望看到这篇小游戏,可以让你重拾童年跟小伙伴一起对着大屁股电视机玩游戏的美好时光! 时间在慢慢的流逝,那些陪你一起度过童年的小伙伴有多久没联系了呢~ 看完这篇炸弹人,有时间的话就找自己童年的小伙伴们聊会天吧,一起找回童年的回忆和梦想! 回归主题,炸弹人小游戏制作开始!

  • Android编程开发中的正则匹配操作示例

    本文实例讲述了Android编程开发中的正则匹配操作.分享给大家供大家参考,具体如下: 在Android开发中,可能也会遇到一下输入框的合法性验证,这时候最常用的就应该是正则表达式去做一些匹配了,下面就常用的正则匹配做一下介绍 1. 手机号码的验证 根据实际开发于2009年9月7日最新统计: 中国电信发布中国3G号码段:中国联通185,186;中国移动188,187;中国电信189,180共6个号段. 移动:134.135.136.137.138.139.150.151.157(TD).158.

  • Android程序开发中单选按钮(RadioGroup)的使用详解

    在还没给大家介绍单选按钮(RadioGroup)的使用,先给大家展示下效果图吧: xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

  • Android应用开发中单元测试分析

    本文主要和大家分享如何在Android应用开发过程中如何进行单元测试,个人在做项目的过程中,觉得单元测试很有必要,以保证我们编写程序的正确性.下面我们先大概了解下单元测试,以及单元测试的作用.        单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单个程序.函数.过程等:对于面向对象编程,最小单元就是方法,包括基类(超类).抽象类.或者派生类(子类)中的方法.单元测试是由程序员自己来完成

  • Android应用开发中数据的保存方式总结

    一.保存文件到手机内存 /** * 保存数据到手机rom的文件里面. * @param context 应用程序的上下文 提供环境 * @param name 用户名 * @param password 密码 * @throws Exception */ public static void saveToRom(Context context, String name , String password) throws Exception{ //File file = new File("/da

  • 全面解析Android应用开发中Activity类的用法

    Activity类处于android.app包中,继承体系如下: 1.java.lang.Object 2.android.content.Context 3.android.app.ApplicationContext 4.android.app.Activity activity是单独的,用于处理用户操作.几乎所有的activity都要和用户打交道,所以activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上,当ac

随机推荐