Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android SurfaceView學習筆記

Android SurfaceView學習筆記

編輯:關於Android編程

最近一直在找一些關於SurfaceView繪制圖像的按例,咱是初學,剛開始壓根兒不知道如何入手繪制圖形在SurfaceView上,最後學習了一下視頻教程,然後將學習過程的筆記加以整理發布如下,在此說明,以下兩個View都是繼承自SurfaceView,是自定義的一兩個View,大家在查看效果的時候,自己可以創建一個Activity,然後在Activity的onCreate方法中加以引用, 即在setContentView(new GameView());或者setContentView(new GameView1);
com.thinkive.ziyouxing.views;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.thinkive.adf.log.Logger;

/**
 * 文件名: com.thinkive.ziyouxing.views.GameView
 * 作者:  熊傑
 * 日期: 14-4-14
 * 時間: 13:40
 * 開發工具: IntelliJ IDEA 12.0.4
 * 開發語言: Java,Android
 * 開發框架:
 * 版本: v0.1
 * 說明
 * 

*/ public class GameView extends SurfaceView implements SurfaceHolder.Callback, Runnable { private SurfaceHolder surfaceHolder; private Canvas canvas; private Paint paint; //默認情況下是一直在運行的 private boolean isRunning = true; //半徑增加 private int x = 0; public GameView(Context context) { super(context); surfaceHolder = this.getHolder(); surfaceHolder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { new Thread(this).start(); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) { } /** * 當SurfaceView消毀時執行,當應用程序退出時,當前SurfaceView就消毀掉了,子線程在運行過程中還在往界面上進行繪制, * View都沒有了,怎麼能往上面進行繪制呢?所以在運行過程中會出異常。 *

* 當View消毀的時候就記線程不要再進行繪制了。 * * @param surfaceHolder */ @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { isRunning = false; } @Override public void run() { while (isRunning) { try { drawView(); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 用線程畫圖 *

* 在做游戲開發的時候,我們要定期的對屏幕進行刷新.即在線程裡面每隔100毫秒,屏幕會繪制一遍。線程什麼時候啟動呢? *

* SurfaceView創建成功之後,有界面了,創建一個啟動線程線程一啟動,每過100毫秒就繪制一遍界面。 *

* 只畫邊界,而不填充裡面的顏色,該如何做呢? *

* paint.setStyle(Paint.Style.STROKE); * 界面被消毀的時候,首先是Canvas被消毀,然後SurfaceHolder才會被消毀 */ private void drawView() { try { if (null != surfaceHolder) { canvas = surfaceHolder.lockCanvas(); paint = new Paint(); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(3); canvas.drawCircle(200, 200, x++, paint); } } catch (Exception e) { Logger.info(this.getClass(), "畫圖異常", e); } finally { if (null != canvas) { surfaceHolder.unlockCanvasAndPost(canvas); } } } /** * 讓子線程提前結束,當按鍵的時候,首先按件事件被響應,這個響應完了之後,界面才退出。也就是從事件開始執行,到界面消毀中間還有那麼一段時間,如果在此方法中就讓線程終止運行 * 當界面真正消毀的時候,子線程已經結束了。 * @param keyCode * @param event * @return */ // @Override // public boolean onKeyDown(int keyCode, KeyEvent event) { // if(keyCode == KeyEvent.KEYCODE_BACK){ // isRunning = false; // } // return true; // } }



package com.thinkive.ziyouxing.views;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * 文件名: com.thinkive.ziyouxing.views.GameView
 * 作者:  熊傑
 * 日期: 14-4-14
 * 時間: 13:40
 * 開發工具: IntelliJ IDEA 12.0.4
 * 開發語言: Java,Android
 * 開發框架:
 * 版本: v0.1
 * 說明
 * 

*/ public class GameView1 extends SurfaceView{ //可以理解為指向SurfaceView的一個指針,可以類比成控制電視機的搖控器,而SurfaceView則是電視機,以後如果要控制電視機, //則只需操作搖控器就可以了。 private SurfaceHolder surfaceHolder; //面板對象 private Canvas canvas; //畫筆 private Paint paint; /** * 當我對象創建成功之後,構造器就會獲得執行,但是構造器執行的時候,界面並沒有顯示出來。對象是有了,但是界面並沒有真正的畫上去,我們應該等當前屏幕畫上去了, * 我再通過屏幕鎖定,我獲得一個面板,面板再畫才可以,因為現在對象剛剛創建成功,界面還沒有出來,獲取到的面板是空的,所以也就不能進行繪制了,那麼現在我怎麼確定執行畫圖的時候, * 這個View界面已經創建成功了呢? * SurfaceView裡面有一個輔助類,sh.addCallBack()這個回調類似於注冊監聽,比如說按鈕的單擊監聽,還有觸摸監聽,按鍵監聽等等。 * 也就是說在SurfaceHolder上面注冊一個監聽,當SurfaceHolder狀態改變的時候,監聽裡面的方法會自動執行。 * 說SurfaceHolder狀態改變,實際上也就是SurfaceView的一個狀態的改變, * 我們再寫事件監聽的時候,基本上所有的事件監聽,所涉及到的那些方法,都是回調方法。 * * 什麼是回調方法呢? * * 也就是這些方法不是我去調用的,而是系統去調用的。 * @param context */ public GameView1(Context context) { super(context); surfaceHolder = this.getHolder(); surfaceHolder.addCallback(new GameViewCallBack()); } class GameViewCallBack implements SurfaceHolder.Callback{ //當SurfaceView創建成功了執行 @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { //鎖定面板之後,會得到一個Canvas,將面板鎖定之後,我就可以進行繪畫了,比如畫圓,畫直線... Canvas canvas = surfaceHolder.lockCanvas(); paint = new Paint(); paint.setColor(Color.RED); canvas.drawLine(0,0,100,100,paint); //繪制結束之後,解除面板鎖定,並且發送,把當前已經畫好的面板,發送到屏幕界面上。把面板發送,發送到哪兒呢?發送到界面上進行顯示。我們說它自帶二級緩存,這個地方就體現了二級緩存, //是我先鎖定,不操作先鎖定,整個畫完之後,顯示就可以了。 surfaceHolder.unlockCanvasAndPost(canvas); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height ) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { } } }


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved