首頁 收藏 QQ群
 網(wǎng)站導航

ZNDS智能電視網(wǎng) 推薦當貝市場

TV應用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計算器

綜合交流 / 評測 / 活動區(qū)

交流區(qū) | 測硬件 | 網(wǎng)站活動 | Z幣中心

新手入門 / 進階 / 社區(qū)互助

新手 | 你問我答 | 免費刷機救磚 | ROM固件

查看: 10812|回復: 0
上一主題 下一主題
[教程]

Android游戲開發(fā)之觸摸軌跡曲線的實現(xiàn)處理(二十四)

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
Android游戲開發(fā)之觸摸軌跡曲線的實現(xiàn)處理   
     
   
   
   
        在上一章的學習中我們已經(jīng)知道如何處理游戲中的觸摸事件,這一章將向同學們介紹繪制游戲觸摸軌跡的曲線圖,在onTouchEvent方法中我們可以拿到手指在屏幕中觸摸點 X Y時時的坐標,這章我們研究的課題就是如何把這些點變成一種無規(guī)則軌跡并且將這條無規(guī)則曲線顯示在屏幕中。   
   
        Android提供了一個Path類 , 顧名思義這個類可以設置曲線路徑軌跡。任何無規(guī)則的曲線實際上都是由若干條線段組成,而線段的定義為兩點之間最短的一條線。path類就 可以記錄這兩點之間的軌跡,那么若干個Path 就是我們須要繪制的無規(guī)則曲線。   
   
下面介紹一下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).   
   
解釋:   
參數(shù)1 軌跡起始點X坐標   
參數(shù)2 軌跡起始點Y坐標   
參數(shù)3 軌跡結束點X坐標   
參數(shù)4 軌跡結束點Y坐標   
所以根據(jù)這個參數(shù)就可以設置一條線段軌跡。   
   
         同學們,我們先看一張效果圖。 為了設置一條比較圓滑好看的曲線我們需要對游戲畫筆進行一些設置。注釋已經(jīng)在代碼中寫的很清楚了,在這里我詳細說一下 設置畫筆風格  mPaint.setStyle(Paint.Style.STROKE); 意思是設置畫筆的風格 android 畫筆一共提供了三種風格Paint.Style.STROKE 、Paint.Style.FILL、Paint.Style.FILL_AND_STROKE 意思分別為 空心 、實心、實心與空心 。如果不設置的話默認為 Paint.Style.FILL,在這里必需設置成空心 因為如果一旦設置成實心或者實心與空心那么畫筆會把path路徑中間包住這樣就不是曲線線段了,所以同學們注意一下這里。   
  1.             /** 創(chuàng)建曲線畫筆 **/   
                mPaint = new Paint();   
                mPaint.setColor(Color.BLACK);   
                /**設置畫筆抗鋸齒**/   
                mPaint.setAntiAlias(true);   
                /**畫筆的類型**/   
                mPaint.setStyle(Paint.Style.STROKE);   
                /**設置畫筆變?yōu)閳A滑狀**/   
                mPaint.setStrokeCap(Paint.Cap.ROUND);   
                /**設置線的寬度**/   
                mPaint.setStrokeWidth(5);
復制代碼
     
   
        在觸摸按下事件中 通過moveTo() 方法設置觸摸屏幕點為軌跡的起始點,這樣在觸摸移動事件中設置曲線的軌跡 起始點為上次觸摸點 結束點為本次觸摸點。使用quadTo方法記錄每次移動產(chǎn)生的一個曲線線段 然后將所有的曲線線段繪制在屏幕中,如果觸摸抬起將調(diào)用reset()方法重置曲線軌跡。   
  1.         @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:   
                    /**設置曲線軌跡起點 X Y坐標**/   
                    mPath.moveTo(x, y);   
                    break;   
                // 觸摸移動的事件   
                case MotionEvent.ACTION_MOVE:   
                    /**設置曲線軌跡**/   
                    //參數(shù)1 起始點X坐標   
                    //參數(shù)2 起始點Y坐標   
                    //參數(shù)3 結束點X坐標   
                    //參數(shù)4 結束點Y坐標   
                    mPath.quadTo(mposX, mposY, x, y);   
                    break;   
                // 觸摸抬起的事件   
                case MotionEvent.ACTION_UP:   
                    /**按鍵抬起后清空路徑軌跡**/   
                    mPath.reset();   
                    break;   
                }   
               //記錄當前觸摸X Y坐標   
                mposX = x;   
                mposY = y;   
                return true;   
            }
復制代碼
游戲繪制中調(diào)用drawPath方法將onTouchEvent中記錄的路徑曲線繪制在屏幕當中。   
  1.         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);   
            }
復制代碼
     
給出整體代碼的實現(xiàn)   
   
詳細的注釋已經(jīng)在代碼中寫出 歡迎大家閱讀   
  1. 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;   
       
            /** 控制游戲更新循環(huán) **/   
            boolean mRunning = false;   
       
            /** 游戲畫布 **/   
            Canvas mCanvas = null;   
       
            /**控制游戲循環(huán)**/   
            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回調(diào)函數(shù)中 **/   
                mSurfaceHolder.addCallback(this);   
                /** 創(chuàng)建畫布 **/   
                mCanvas = new Canvas();   
                /** 創(chuàng)建曲線畫筆 **/   
                mPaint = new Paint();   
                mPaint.setColor(Color.BLACK);   
                /**設置畫筆抗鋸齒**/   
                mPaint.setAntiAlias(true);   
                /**畫筆的類型**/   
                mPaint.setStyle(Paint.Style.STROKE);   
                /**設置畫筆變?yōu)閳A滑狀**/   
                mPaint.setStrokeCap(Paint.Cap.ROUND);   
                /**設置線的寬度**/   
                mPaint.setStrokeWidth(5);   
                /**創(chuàng)建路徑對象**/   
                mPath = new Path();   
                /** 創(chuàng)建文字畫筆 **/   
                mTextPaint = new Paint();   
                /**設置顏色**/   
                mTextPaint.setColor(Color.BLACK);   
                /**設置文字大小**/   
                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:   
                    /**設置曲線軌跡起點 X Y坐標**/   
                    mPath.moveTo(x, y);   
                    break;   
                // 觸摸移動的事件   
                case MotionEvent.ACTION_MOVE:   
                    /**設置曲線軌跡**/   
                    //參數(shù)1 起始點X坐標   
                    //參數(shù)2 起始點Y坐標   
                    //參數(shù)3 結束點X坐標   
                    //參數(shù)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) {   
                /**開始游戲主循環(huán)線程**/   
                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();   
       
                    /** 計算出游戲一次更新的毫秒數(shù) **/   
                    int diffTime = (int) (endTime - startTime);   
       
                    /** 確保每次更新時間為50幀 **/   
                    while (diffTime <= TIME_IN_FRAME) {   
                        diffTime = (int) (System.currentTimeMillis() - startTime);   
                        /** 線程等待 **/   
                        Thread.yield();   
                    }   
       
                }   
       
            }   
        }   
    }
復制代碼
總體來說這章內(nèi)容還是比較簡單的,老規(guī)矩每篇文章都會附帶源代碼,最后如果你還是覺得我寫的不夠詳細 看的不夠爽 不要緊我把源代碼的下載地址貼出來 歡迎大家一起討論學習   
第十四講觸摸軌跡曲線.rar(125.29 KB, 下載次數(shù): 619)[/I]2011-9-3 00:54 上傳點擊文件名   下載積分: 下載豆 -2

上一篇:Android完全退出應用程序
下一篇:Data Storage +AMS 課件共享
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

Archiver|新帖|標簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號 )

網(wǎng)絡信息服務信用承諾書 | 增值電信業(yè)務經(jīng)營許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號

GMT+8, 2024-10-19 20:33 , Processed in 0.064764 second(s), 15 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報:report#znds.com (請將#替換為@)

© 2007-2024 ZNDS.Com

快速回復 返回頂部 返回列表