热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

本文主要介绍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游戏开发中自如的运用它们。

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


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 距离11月的软考还有不到五个月的时间,考试将于11月5日至6日举行。许多朋友对软考的具体情况还不太了解:它是什么?有何用途?本文将为你详细解答。 ... [详细]
  • 本文介绍如何在 Android 中通过代码模拟用户的点击和滑动操作,包括参数说明、事件生成及处理逻辑。详细解析了视图(View)对象、坐标偏移量以及不同类型的滑动方式。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • Valve 发布 Steam Deck 的新版 Windows 驱动程序
    Valve 最新发布了针对 Steam Deck 掌机的 Windows 驱动程序,旨在提升其在 Windows 环境下的兼容性、安全性和性能表现。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文总结了汇编语言中第五至第八章的关键知识点,涵盖间接寻址、指令格式、安全编程空间、逻辑运算指令及数据重复定义等内容。通过详细解析这些内容,帮助读者更好地理解和应用汇编语言的高级特性。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
author-avatar
飞天猪的世界公寓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有