Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 在surfaceView上畫圖

android 在surfaceView上畫圖

編輯:關於Android編程

為了在SurfaceView上畫圖,我們定義一個MySurfaceView類,該類繼承SurfaceView並且實現SurfaceHolder.Callback接口。在surfaceCreated方法中我們啟動一個線程,在該線程中實現對畫布canvas的操作。

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
/**
 * 
 * @author xu duzhou
 *
 */
public class Mysurfaceview extends SurfaceView implements Callback {
    SurfaceHolder holder;
    MysurfaceviewThread mysurfaceviewThread;

    public Mysurfaceview(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        holder = getHolder();//獲取SurfaceHolder對象,同時指定callback
        holder.addCallback(this);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Auto-generated method stub

    }
    
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 當SurfaceView被創建時,將畫圖Thread啟動起來。
        mysurfaceviewThread = new MysurfaceviewThread();
        mysurfaceviewThread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // 當SurfaceView被銷毀時,釋放資源。
        if (mysurfaceviewThread != null) {
            mysurfaceviewThread.exit();
            mysurfaceviewThread = null;
        }
    }
    /**
     * 內部類 MysurfaceviewThread,該類主要實現對canvas的具體操作。
     * @author xu duzhou
     *
     */
    class MysurfaceviewThread extends Thread {
        private boolean done = false;
        public MysurfaceviewThread() {
            super();
            this.done = false;
        }

        public void exit() {
            // 將done設置為true 使線程中的while循環結束。
            done = true;
            try {
                join();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }

        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            SurfaceHolder surfaceHolder = holder;
            int i = 1;
            int j = 0;
            while (!done) {
                if (i > j) {
                    j = i;
                    i++;
                } else {
                    j = i;
                    i--;
                }
                synchronized (surfaceHolder) {
                    //鎖定canvas
                    Canvas canvas = surfaceHolder.lockCanvas();
                    //canvas 執行一系列畫的動作
                    canvas.drawColor(Color.BLACK);
                    Bitmap _bit = BitmapFactory.decodeResource(getResources(),
                            R.drawable.ic_launcher);
                    canvas.drawBitmap(_bit, 10 + i, 10 + i, null);//使用默認的Paint對象
                    //釋放canvas對象,並發送到SurfaceView
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
                if (i == 100) {
                    j = i;
                }
                if (i == 1) {
                    j = 0;
                }
            }
        }
    }
}


在activity使用該SurfaceView

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new Mysurfaceview(this));
    }


程序運行結果就是 圖片來回的運動如下圖:

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