自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android游戲開發(fā)中繪制游戲觸摸軌跡的曲線圖

移動(dòng)開發(fā) Android 游戲開發(fā)
本篇文章主要來講解怎樣繪制游戲觸摸軌跡的曲線圖。如何用onTouchEvent方法中可以獲取到觸摸屏幕時(shí)手指觸摸點(diǎn)的x、y坐標(biāo)這些點(diǎn)形成一條無規(guī)則軌跡并把這條無規(guī)則軌跡曲線顯示在屏幕上就是本篇文章的主旨內(nèi)容。

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

Android Path類

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

下面介紹一下API 中path類設(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è)置一條線段軌跡。

分步講解

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

  1. /** 創(chuàng)建曲線畫筆 **/   
  2. mPaint = new Paint();    
  3. mPaint.setColor(Color.BLACK);    
  4. /**設(shè)置畫筆抗鋸齒**/   
  5. mPaint.setAntiAlias(true);    
  6. /**畫筆的類型**/   
  7. mPaint.setStyle(Paint.Style.STROKE);    
  8. /**設(shè)置畫筆變?yōu)閳A滑狀**/   
  9. mPaint.setStrokeCap(Paint.Cap.ROUND);    
  10. /**設(shè)置線的寬度**/   
  11. mPaint.setStrokeWidth(5);  

在觸摸按下事件中 通過moveTo() 方法設(shè)置觸摸屏幕點(diǎn)為軌跡的起始點(diǎn),這樣在觸摸移動(dòng)事件中設(shè)置曲線的軌跡 起始點(diǎn)為上次觸摸點(diǎn) 結(jié)束點(diǎn)為本次觸摸點(diǎn)。使用quadTo方法記錄每次移動(dòng)產(chǎn)生的一個(gè)曲線線段 然后將所有的曲線線段繪制在屏幕中,如果觸摸抬起將調(diào)用reset()方法重置曲線軌跡。

  1. @Override   
  2. public boolean onTouchEvent(MotionEvent event) {    
  3.     /** 拿到觸摸的狀態(tài) **/   
  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.     /**設(shè)置曲線軌跡起點(diǎn) X Y坐標(biāo)**/   
  11.     mPath.moveTo(x, y);    
  12.     break;    
  13.     // 觸摸移動(dòng)的事件    
  14.     case MotionEvent.ACTION_MOVE:    
  15.     /**設(shè)置曲線軌跡**/   
  16.     //參數(shù)1 起始點(diǎn)X坐標(biāo)    
  17.     //參數(shù)2 起始點(diǎn)Y坐標(biāo)    
  18.     //參數(shù)3 結(jié)束點(diǎn)X坐標(biāo)    
  19.     //參數(shù)4 結(jié)束點(diǎn)Y坐標(biāo)    
  20.     mPath.quadTo(mposX, mposY, x, y);    
  21.     break;    
  22.     // 觸摸抬起的事件    
  23.     case MotionEvent.ACTION_UP:    
  24.     /**按鍵抬起后清空路徑軌跡**/   
  25.     mPath.reset();    
  26.     break;    
  27.     }    
  28.    //記錄當(dāng)前觸摸X Y坐標(biāo)    
  29.     mposX = x;    
  30.     mposY = y;    
  31.     return true;    
  32. }    

游戲繪制中調(diào)用drawPath方法將onTouchEvent中記錄的路徑曲線繪制在屏幕當(dāng)中。

  1. private void Draw() {    
  2.     /**清空畫布**/   
  3.     mCanvas.drawColor(Color.WHITE);    
  4.     /**繪制曲線**/   
  5.     mCanvas.drawPath(mPath, mPaint);    
  6.     /**記錄當(dāng)前觸點(diǎn)位置**/   
  7.     mCanvas.drawText("當(dāng)前觸筆 X:" + mposX, 020,mTextPaint);    
  8.     mCanvas.drawText("當(dāng)前觸筆 Y:" + mposY, 040,mTextPaint);    
  9. }   

代碼的整體實(shí)現(xiàn)

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

  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.     /** 控制游戲更新循環(huán) **/   
  35.     boolean mRunning = false;    
  36.     /** 游戲畫布 **/   
  37.     Canvas mCanvas = null;    
  38.     /**控制游戲循環(huán)**/   
  39.     boolean mIsRunning = false;    
  40.     /**曲線方向**/   
  41.     private Path mPath;    
  42.     private float mposX, mposY;    
  43.     public MyView(Context context) {    
  44.         super(context);    
  45.         /** 設(shè)置當(dāng)前View擁有控制焦點(diǎn) **/   
  46.         this.setFocusable(true);    
  47.         /** 設(shè)置當(dāng)前View擁有觸摸事件 **/   
  48.         this.setFocusableInTouchMode(true);    
  49.         /** 拿到SurfaceHolder對(duì)象 **/   
  50.         mSurfaceHolder = this.getHolder();    
  51.         /** 將mSurfaceHolder添加到Callback回調(diào)函數(shù)中 **/   
  52.         mSurfaceHolder.addCallback(this);    
  53.         /** 創(chuàng)建畫布 **/   
  54.         mCanvas = new Canvas();    
  55.         /** 創(chuàng)建曲線畫筆 **/   
  56.         mPaint = new Paint();    
  57.         mPaint.setColor(Color.BLACK);    
  58.         /**設(shè)置畫筆抗鋸齒**/   
  59.         mPaint.setAntiAlias(true);    
  60.         /**畫筆的類型**/   
  61.         mPaint.setStyle(Paint.Style.STROKE);    
  62.         /**設(shè)置畫筆變?yōu)閳A滑狀**/   
  63.         mPaint.setStrokeCap(Paint.Cap.ROUND);    
  64.         /**設(shè)置線的寬度**/   
  65.         mPaint.setStrokeWidth(5);    
  66.         /**創(chuàng)建路徑對(duì)象**/   
  67.         mPath = new Path();    
  68.         /** 創(chuàng)建文字畫筆 **/   
  69.         mTextPaint = new Paint();    
  70.         /**設(shè)置顏色**/   
  71.         mTextPaint.setColor(Color.BLACK);    
  72.         /**設(shè)置文字大小**/   
  73.         mTextPaint.setTextSize(15);    
  74.     }    
  75.     @Override   
  76.     public boolean onTouchEvent(MotionEvent event) {    
  77.         /** 拿到觸摸的狀態(tài) **/   
  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.         /**設(shè)置曲線軌跡起點(diǎn) X Y坐標(biāo)**/   
  85.         mPath.moveTo(x, y);    
  86.         break;    
  87.         // 觸摸移動(dòng)的事件    
  88.         case MotionEvent.ACTION_MOVE:    
  89.         /**設(shè)置曲線軌跡**/   
  90.         //參數(shù)1 起始點(diǎn)X坐標(biāo)    
  91.         //參數(shù)2 起始點(diǎn)Y坐標(biāo)    
  92.         //參數(shù)3 結(jié)束點(diǎn)X坐標(biāo)    
  93.         //參數(shù)4 結(jié)束點(diǎn)Y坐標(biāo)    
  94.         mPath.quadTo(mposX, mposY, x, y);    
  95.         break;    
  96.         // 觸摸抬起的事件    
  97.         case MotionEvent.ACTION_UP:    
  98.         /**按鍵抬起后清空路徑軌跡**/   
  99.         mPath.reset();    
  100.         break;    
  101.         }    
  102.        //記錄當(dāng)前觸摸X Y坐標(biāo)    
  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.         /**記錄當(dāng)前觸點(diǎn)位置**/   
  113.         mCanvas.drawText("當(dāng)前觸筆 X:" + mposX, 020,mTextPaint);    
  114.         mCanvas.drawText("當(dāng)前觸筆 Y:" + mposY, 040,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.         /**開始游戲主循環(huán)線程**/   
  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.         /** 取得更新游戲之前的時(shí)間 **/   
  134.         long startTime = System.currentTimeMillis();    
  135.         /** 在這里加上線程安全鎖 **/   
  136.         synchronized (mSurfaceHolder) {    
  137.             /** 拿到當(dāng)前畫布 然后鎖定 **/   
  138.             mCanvas = mSurfaceHolder.lockCanvas();    
  139.             Draw();    
  140.             /** 繪制結(jié)束后解鎖顯示在屏幕上 **/   
  141.             mSurfaceHolder.unlockCanvasAndPost(mCanvas);    
  142.         }    
  143.         /** 取得更新游戲結(jié)束的時(shí)間 **/   
  144.         long endTime = System.currentTimeMillis();    
  145.         /** 計(jì)算出游戲一次更新的毫秒數(shù) **/   
  146.         int diffTime = (int) (endTime - startTime);    
  147.         /** 確保每次更新時(shí)間為50幀 **/   
  148.         while (diffTime <= TIME_IN_FRAME) {    
  149.             diffTime = (int) (System.currentTimeMillis() - startTime);    
  150.             /** 線程等待 **/   
  151.             Thread.yield();    
  152.         }    
  153.         }    
  154.     }    
  155.     }    
  156. }   

看懂并掌握了這些代碼實(shí)例后,相信大家對(duì)如何繪制游戲觸摸軌跡的曲線圖有了方法上的認(rèn)識(shí)了,希望大家在Android游戲開發(fā)中自如的運(yùn)用它們。

責(zé)任編輯:閆佳明 來源: jizhuomi
相關(guān)推薦

2021-01-04 11:10:14

鴻蒙HarmonyOSCanvas

2014-03-17 16:53:34

2013-05-20 15:42:22

2013-05-21 15:28:31

2013-05-21 16:17:13

2022-06-10 15:51:22

機(jī)器學(xué)習(xí)數(shù)據(jù)模型學(xué)習(xí)

2013-06-09 11:18:44

C++程序員

2010-03-03 15:06:52

Android 游戲開

2011-12-12 13:58:11

TinyCoiOSAndroid

2011-06-27 10:45:06

BattleheartAndroid游戲開發(fā)

2013-07-24 10:10:08

2013-07-17 18:38:32

Android游戲源碼Android源碼下載Android坦克大戰(zhàn)

2012-12-24 09:07:09

iOSUnity3D

2011-07-18 11:07:12

iPhone 游戲 引擎

2011-07-18 10:53:09

2024-12-02 11:15:08

2011-07-18 12:29:10

2011-07-18 11:39:58

iPhone 游戲 引擎

2011-07-18 11:23:29

iPhone 游戲 動(dòng)畫

2012-05-22 14:26:15

XNA 橫豎屏設(shè)置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)