国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

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

2019-12-12 05:34:38
字體:
來源:轉載
供稿:網友

       本篇文章主要來講解怎樣繪制游戲觸摸軌跡的曲線圖。

       我們在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游戲開發中自如的運用它們。

        以上就是小編對繪制游戲觸摸軌跡的曲線圖的資料整理,后續繼續補充相關資料,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 双桥区| 长海县| 彭州市| 高阳县| 满城县| 安丘市| 攀枝花市| 灵宝市| 平和县| 吉首市| 鄂尔多斯市| 白银市| 夹江县| 汉中市| 井陉县| 静乐县| 石渠县| 九寨沟县| 晴隆县| 吉首市| 吉木萨尔县| 肇源县| 宝坻区| 乐昌市| 丰宁| 穆棱市| 绥芬河市| 新竹市| 水富县| 静海县| 论坛| 辛集市| 涪陵区| 桓台县| 信阳市| 江城| 无极县| 和龙市| 嵊泗县| 海口市| 花莲市|