SurfaceView 畫筆隨機顏色滿天星

SurfaceView是個重要的繪圖容器,它可以在主線程外的線程中向屏幕繪圖,這樣可以避免畫圖任務繁重的時候造成主線程阻塞,從而提高了程序的反應速度。在遊戲開發中多用到SurfaceView,遊戲中的背景、人物、動畫等等儘量在畫布canvas中畫出。

可以把Surface理解爲顯存的一個映射,寫入到Surface的內容可以直接複製到顯存從而顯示出來,這會使得顯示速度非常快),Surface被銷燬之前必須結束。

代碼塊:

package com.example.lesson_surfaceview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MySurfaceView(this));

    }
}

package com.example.lesson_surfaceview;

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

/**
 * Created by Administrator on 2017/3/20 0020.
 */

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable {
    public MySurfaceView(Context context) {
        super(context);
        init();
    }
    SurfaceHolder holder;
    // 創建筆
    Paint paint = new Paint();
    private void init() {
        // 添加回調監聽
        holder = getHolder();
        // 實現SurfaceHolder.Callback接口
        holder.addCallback(this);
        // 設置筆的大小(單位float)
        paint.setStrokeWidth(100f);
    }


    private void myDraw(Canvas canvas) {
        // 設置畫筆的顏色(把畫筆的顏色設置成隨機顏色,要放到這個方法裏面才能出現重複隨機(循環中調用了這個方法))
        paint.setARGB((int) (Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255));
        // 設置在畫布畫點(point)和畫筆隨機出現的位置
        canvas.drawPoint((int)(Math.random()*getWidth()),(int)(Math.random()*getHeight()),paint);
    }

    public MySurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 實現Runnable接口創建線程開啓線程
        new Thread(this).start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    @Override
    public void run() {
        while(true){
            Canvas canvas = holder.lockCanvas();
            // 要自己寫Draw方法
            myDraw(canvas);
            holder.unlockCanvasAndPost(canvas);
        }
    }
}

運行效果如圖所示



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章