日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

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

發(fā)布時(shí)間:2024/8/26 Android 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android游戏开发中绘制游戏触摸轨迹的曲线图 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?? 本篇文章主要來(lái)講解怎樣繪制游戲觸摸軌跡的曲線(xiàn)圖。

?????? 我們?cè)趏nTouchEvent方法中,可以獲取到觸摸屏幕時(shí)手指觸摸點(diǎn)的x、y坐標(biāo),如何用這些點(diǎn)形成一條無(wú)規(guī)則軌跡并把這條無(wú)規(guī)則軌跡曲線(xiàn)顯示在屏幕上就是本篇文章的主旨內(nèi)容。

???????Android Path類(lèi)

???????Android提供了一個(gè)Path類(lèi) , 顧名思義這個(gè)類(lèi)可以設(shè)置曲線(xiàn)路徑軌跡。任何無(wú)規(guī)則的曲線(xiàn)實(shí)際上都是由若干條線(xiàn)段組成,而線(xiàn)段的定義為兩點(diǎn)之間最短的一條線(xiàn)。path類(lèi)就 可以記錄這兩點(diǎn)之間的軌跡,那么若干個(gè)Path 就是我們須要繪制的無(wú)規(guī)則曲線(xiàn)。

?????? 下面介紹一下API 中path類(lèi)設(shè)置軌跡路徑的方法。

?????? 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).

?????? 解釋:

?????? 參數(shù)1 軌跡起始點(diǎn)X坐標(biāo)

?????? 參數(shù)2 軌跡起始點(diǎn)Y坐標(biāo)

?????? 參數(shù)3 軌跡結(jié)束點(diǎn)X坐標(biāo)

?????? 參數(shù)4 軌跡結(jié)束點(diǎn)Y坐標(biāo)

?????? 所以根據(jù)這個(gè)參數(shù)就可以設(shè)置一條線(xiàn)段軌跡。

???????分步講解

?????? 為了設(shè)置一條比較圓滑好看的曲線(xiàn)我們需要對(duì)游戲畫(huà)筆進(jìn)行一些設(shè)置。注釋已經(jīng)在代碼中寫(xiě)的很清楚了,在這里我詳細(xì)說(shuō)一下 設(shè)置畫(huà)筆風(fēng)格? mPaint.setStyle(Paint.Style.STROKE); 意思是設(shè)置畫(huà)筆的風(fēng)格 android 畫(huà)筆一共提供了三種風(fēng)格Paint.Style.STROKE 、Paint.Style.FILL、Paint.Style.FILL_AND_STROKE 意思分別為 空心 、實(shí)心、實(shí)心與空心 。如果不設(shè)置的話(huà)默認(rèn)為 Paint.Style.FILL,在這里必須設(shè)置成空心。因?yàn)槿绻坏┰O(shè)置成實(shí)心或者實(shí)心與空心那么畫(huà)筆會(huì)把path路徑中間包住這樣就不是曲線(xiàn)線(xiàn)段了,所以大家注意一下這里。

Java代碼

  • /**?創(chuàng)建曲線(xiàn)畫(huà)筆?**/??
  • mPaint?=?new?Paint(); ??
  • mPaint.setColor(Color.BLACK); ??
  • /**設(shè)置畫(huà)筆抗鋸齒**/??
  • mPaint.setAntiAlias(true); ??
  • /**畫(huà)筆的類(lèi)型**/??
  • mPaint.setStyle(Paint.Style.STROKE); ??
  • /**設(shè)置畫(huà)筆變?yōu)閳A滑狀**/??
  • mPaint.setStrokeCap(Paint.Cap.ROUND); ??
  • /**設(shè)置線(xiàn)的寬度**/??
  • mPaint.setStrokeWidth(5);??
  • ?????? 在觸摸按下事件中 通過(guò)moveTo() 方法設(shè)置觸摸屏幕點(diǎn)為軌跡的起始點(diǎn),這樣在觸摸移動(dòng)事件中設(shè)置曲線(xiàn)的軌跡 起始點(diǎn)為上次觸摸點(diǎn) 結(jié)束點(diǎn)為本次觸摸點(diǎn)。使用quadTo方法記錄每次移動(dòng)產(chǎn)生的一個(gè)曲線(xiàn)線(xiàn)段 然后將所有的曲線(xiàn)線(xiàn)段繪制在屏幕中,如果觸摸抬起將調(diào)用reset()方法重置曲線(xiàn)軌跡。

    Java代碼

  • @Override??
  • public?boolean?onTouchEvent(MotionEvent?event)?{ ??
  • ????/**?拿到觸摸的狀態(tài)?**/??
  • ????int?action?=?event.getAction(); ??
  • ????float?x?=?event.getX(); ??
  • ????float?y?=?event.getY(); ??
  • ????switch?(action)?{ ??
  • ????//?觸摸按下的事件???
  • ????case?MotionEvent.ACTION_DOWN: ??
  • ????/**設(shè)置曲線(xiàn)軌跡起點(diǎn)?X?Y坐標(biāo)**/??
  • ????mPath.moveTo(x,?y); ??
  • ????break; ??
  • ????//?觸摸移動(dòng)的事件???
  • ????case?MotionEvent.ACTION_MOVE: ??
  • ????/**設(shè)置曲線(xiàn)軌跡**/??
  • ????//參數(shù)1?起始點(diǎn)X坐標(biāo)???
  • ????//參數(shù)2?起始點(diǎn)Y坐標(biāo)???
  • ????//參數(shù)3?結(jié)束點(diǎn)X坐標(biāo)???
  • ????//參數(shù)4?結(jié)束點(diǎn)Y坐標(biāo)???
  • ????mPath.quadTo(mposX,?mposY,?x,?y); ??
  • ????break; ??
  • ????//?觸摸抬起的事件???
  • ????case?MotionEvent.ACTION_UP: ??
  • ????/**按鍵抬起后清空路徑軌跡**/??
  • ????mPath.reset(); ??
  • ????break; ??
  • ????} ??
  • ???//記錄當(dāng)前觸摸X?Y坐標(biāo)???
  • ????mposX?=?x; ??
  • ????mposY?=?y; ??
  • ????return?true; ??
  • } ??
  • ????? 游戲繪制中調(diào)用drawPath方法將onTouchEvent中記錄的路徑曲線(xiàn)繪制在屏幕當(dāng)中。

    Java代碼

  • private?void?Draw()?{ ??
  • ????/**清空畫(huà)布**/??
  • ????mCanvas.drawColor(Color.WHITE); ??
  • ????/**繪制曲線(xiàn)**/??
  • ????mCanvas.drawPath(mPath,?mPaint); ??
  • ????/**記錄當(dāng)前觸點(diǎn)位置**/??
  • ????mCanvas.drawText("當(dāng)前觸筆?X:"?+?mposX,?0,?20,mTextPaint); ??
  • ????mCanvas.drawText("當(dāng)前觸筆?Y:"?+?mposY,?0,?40,mTextPaint); ??
  • }??
  • ???????代碼的整體實(shí)現(xiàn)

    ?????? 詳細(xì)的論壇注釋已經(jīng)在代碼中寫(xiě)出 歡迎大家閱讀喔 哇咔咔~~~~

    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; ??
  • ????/**?游戲畫(huà)筆?**/??
  • ????Paint?mPaint?=?null; ??
  • ????Paint?mTextPaint?=?null; ??
  • ????SurfaceHolder?mSurfaceHolder?=?null; ??
  • ????/**?控制游戲更新循環(huán)?**/??
  • ????boolean?mRunning?=?false; ??
  • ????/**?游戲畫(huà)布?**/??
  • ????Canvas?mCanvas?=?null; ??
  • ????/**控制游戲循環(huán)**/??
  • ????boolean?mIsRunning?=?false; ??
  • ????/**曲線(xiàn)方向**/??
  • ????private?Path?mPath; ??
  • ????private?float?mposX,?mposY; ??
  • ????public?MyView(Context?context)?{ ??
  • ????????super(context); ??
  • ????????/**?設(shè)置當(dāng)前View擁有控制焦點(diǎn)?**/??
  • ????????this.setFocusable(true); ??
  • ????????/**?設(shè)置當(dāng)前View擁有觸摸事件?**/??
  • ????????this.setFocusableInTouchMode(true); ??
  • ????????/**?拿到SurfaceHolder對(duì)象?**/??
  • ????????mSurfaceHolder?=?this.getHolder(); ??
  • ????????/**?將mSurfaceHolder添加到Callback回調(diào)函數(shù)中?**/??
  • ????????mSurfaceHolder.addCallback(this); ??
  • ????????/**?創(chuàng)建畫(huà)布?**/??
  • ????????mCanvas?=?new?Canvas(); ??
  • ????????/**?創(chuàng)建曲線(xiàn)畫(huà)筆?**/??
  • ????????mPaint?=?new?Paint(); ??
  • ????????mPaint.setColor(Color.BLACK); ??
  • ????????/**設(shè)置畫(huà)筆抗鋸齒**/??
  • ????????mPaint.setAntiAlias(true); ??
  • ????????/**畫(huà)筆的類(lèi)型**/??
  • ????????mPaint.setStyle(Paint.Style.STROKE); ??
  • ????????/**設(shè)置畫(huà)筆變?yōu)閳A滑狀**/??
  • ????????mPaint.setStrokeCap(Paint.Cap.ROUND); ??
  • ????????/**設(shè)置線(xiàn)的寬度**/??
  • ????????mPaint.setStrokeWidth(5); ??
  • ????????/**創(chuàng)建路徑對(duì)象**/??
  • ????????mPath?=?new?Path(); ??
  • ????????/**?創(chuàng)建文字畫(huà)筆?**/??
  • ????????mTextPaint?=?new?Paint(); ??
  • ????????/**設(shè)置顏色**/??
  • ????????mTextPaint.setColor(Color.BLACK); ??
  • ????????/**設(shè)置文字大小**/??
  • ????????mTextPaint.setTextSize(15); ??
  • ????} ??
  • ????@Override??
  • ????public?boolean?onTouchEvent(MotionEvent?event)?{ ??
  • ????????/**?拿到觸摸的狀態(tài)?**/??
  • ????????int?action?=?event.getAction(); ??
  • ????????float?x?=?event.getX(); ??
  • ????????float?y?=?event.getY(); ??
  • ????????switch?(action)?{ ??
  • ????????//?觸摸按下的事件???
  • ????????case?MotionEvent.ACTION_DOWN: ??
  • ????????/**設(shè)置曲線(xiàn)軌跡起點(diǎn)?X?Y坐標(biāo)**/??
  • ????????mPath.moveTo(x,?y); ??
  • ????????break; ??
  • ????????//?觸摸移動(dòng)的事件???
  • ????????case?MotionEvent.ACTION_MOVE: ??
  • ????????/**設(shè)置曲線(xiàn)軌跡**/??
  • ????????//參數(shù)1?起始點(diǎn)X坐標(biāo)???
  • ????????//參數(shù)2?起始點(diǎn)Y坐標(biāo)???
  • ????????//參數(shù)3?結(jié)束點(diǎn)X坐標(biāo)???
  • ????????//參數(shù)4?結(jié)束點(diǎn)Y坐標(biāo)???
  • ????????mPath.quadTo(mposX,?mposY,?x,?y); ??
  • ????????break; ??
  • ????????//?觸摸抬起的事件???
  • ????????case?MotionEvent.ACTION_UP: ??
  • ????????/**按鍵抬起后清空路徑軌跡**/??
  • ????????mPath.reset(); ??
  • ????????break; ??
  • ????????} ??
  • ???????//記錄當(dāng)前觸摸X?Y坐標(biāo)???
  • ????????mposX?=?x; ??
  • ????????mposY?=?y; ??
  • ????????return?true; ??
  • ????} ??
  • ????private?void?Draw()?{ ??
  • ????????/**清空畫(huà)布**/??
  • ????????mCanvas.drawColor(Color.WHITE); ??
  • ????????/**繪制曲線(xiàn)**/??
  • ????????mCanvas.drawPath(mPath,?mPaint); ??
  • ????????/**記錄當(dāng)前觸點(diǎn)位置**/??
  • ????????mCanvas.drawText("當(dāng)前觸筆?X:"?+?mposX,?0,?20,mTextPaint); ??
  • ????????mCanvas.drawText("當(dāng)前觸筆?Y:"?+?mposY,?0,?40,mTextPaint); ??
  • ????} ??
  • ????@Override??
  • ????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width, ??
  • ????????int?height)?{ ??
  • ????} ??
  • ????@Override??
  • ????public?void?surfaceCreated(SurfaceHolder?holder)?{ ??
  • ????????/**開(kāi)始游戲主循環(huán)線(xiàn)程**/??
  • ????????mIsRunning?=?true; ??
  • ????????new?Thread(this).start(); ??
  • ????} ??
  • ????@Override??
  • ????public?void?surfaceDestroyed(SurfaceHolder?holder)?{ ??
  • ????????mIsRunning?=?false; ??
  • ????} ??
  • ????@Override??
  • ????public?void?run()?{ ??
  • ????????while?(mIsRunning)?{ ??
  • ????????/**?取得更新游戲之前的時(shí)間?**/??
  • ????????long?startTime?=?System.currentTimeMillis(); ??
  • ????????/**?在這里加上線(xiàn)程安全鎖?**/??
  • ????????synchronized?(mSurfaceHolder)?{ ??
  • ????????????/**?拿到當(dāng)前畫(huà)布?然后鎖定?**/??
  • ????????????mCanvas?=?mSurfaceHolder.lockCanvas(); ??
  • ????????????Draw(); ??
  • ????????????/**?繪制結(jié)束后解鎖顯示在屏幕上?**/??
  • ????????????mSurfaceHolder.unlockCanvasAndPost(mCanvas); ??
  • ????????} ??
  • ????????/**?取得更新游戲結(jié)束的時(shí)間?**/??
  • ????????long?endTime?=?System.currentTimeMillis(); ??
  • ????????/**?計(jì)算出游戲一次更新的毫秒數(shù)?**/??
  • ????????int?diffTime?=?(int)?(endTime?-?startTime); ??
  • ????????/**?確保每次更新時(shí)間為50幀?**/??
  • ????????while?(diffTime?<=?TIME_IN_FRAME)?{ ??
  • ????????????diffTime?=?(int)?(System.currentTimeMillis()?-?startTime); ??
  • ????????????/**?線(xiàn)程等待?**/??
  • ????????????Thread.yield(); ??
  • ????????} ??
  • ????????} ??
  • ????} ??
  • ????} ??
  • }??
  • ?????? 看懂并掌握了這些代碼實(shí)例后,相信大家對(duì)如何繪制游戲觸摸軌跡的曲線(xiàn)圖有了方法上的認(rèn)識(shí)了,希望大家在Android游戲開(kāi)發(fā)中自如的運(yùn)用它們。

    與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的Android游戏开发中绘制游戏触摸轨迹的曲线图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。