android中SurfaceView組件使用解析

SurfaceView組件能夠實現高效率的繪製二維圖或者顯示圖像,在遊戲開發中常常用到。在android中,已經提供了SurfaceView組件。使用時,通常是經過繼承的方法實現自定義surfaceView,也能夠在MainActivity中經過接口surfaceHolder.callback接口實現,這裏介紹經過接口實現surfaceView繪圖,固然,繪圖能夠是靜態圖(在指定區域只繪製一次),也能夠是動態圖(指定區域-->繪製-->再循環)。java

SurfaceView組件的使用流程:經過findViewById()實例化SurfaceView組件,獲得實例化對象;利用getHolder()方法獲得SurfaceViewHolder類對象,爲該對象添加callBack(Context context)回調;在surfaceCreate()方法中添加surfaceView剛顯示的初始化代碼,這個方法在實例化SurfaceView組件時執行,好比能夠初始化背景顏色,繪圖區顯示出的形狀、座標等;surfaceChanged()方法主要是在surfaceView對象大小、形狀改變時調用;surfaceDestroyed()方法是在surfaceView銷燬時調用,通常是添加kill代碼。android

在SurfaceView組件顯示區域上,實現繪製二維圖形須要三個類:Paint、Canvas和SurfaceHolder類。其中Paint類指的是畫筆,能夠設置畫筆的顏色(相似於紅筆芯仍是藍筆芯),畫筆顯示的線寬(相似於0.35mm仍是0.5mm)等;Canvas類至關於畫布,它經過SurfaceHolder類中的lockCanvas()方法得到,這個lockCanvas()方法能夠帶有參數,用來指定鎖定畫布的區域(也就是說,畫布鎖定的區域不必定是surfaceView定義的所有區域,也能夠是參數指定的部分區域),當鎖定了區域以後,就能夠經過Canvas類實例對象所提供的方法來繪製點、線、圓、矩形、圖像等,這些方法中的參數通常會有Paint類對象。canvas

須要注意的一點是,在鎖定畫布區域進行繪製圖形或者圖像的代碼,通常是開一個獨立線程進行的,這個線程能夠在surfaceCreate()方法中開啓。app

唉,圖片加不上去,只能貼代碼了。ide

package com.main.dfa_surfaceview;
 
import android.support.v7.app.ActionBarActivity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
 
public class MainActivity extends ActionBarActivity implements SurfaceHolder.Callback {
    Button btn1=null;
    SurfaceView sfc=null;
    SurfaceHolder holder=null;
    Paint paint_one=null;
    Paint paint_two=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        
        btn1=(Button)findViewById(R.id.btn1);
        sfc=(SurfaceView)findViewById(R.id.surfaceView1);
        holder=sfc.getHolder(); //獲得surfaceView的holder,相似於surfaceView的控制器
        holder.addCallback(this);
        
        paint_one=new Paint(); //獲取畫筆實例
        paint_two=new Paint();
        paint_one.setColor(Color.BLUE); //畫筆顏色
        paint_two.setColor(Color.GREEN);
        paint_one.setStrokeWidth(20); //設置線寬
        paint_two.setStrokeWidth(10); 
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, "asdgdsgas", Toast.LENGTH_SHORT).show();
                MyThread mthread=new MyThread();
                mthread.start();
            }
        });       
    }
    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
        
    }
    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        // TODO Auto-generated method stub
        //當surfaceView建立的時候執行
        init_background();//初始化繪圖界面
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        // TODO Auto-generated method stub
        
    }
    
    private void init_background(){
        Canvas canvas=null;
        canvas=holder.lockCanvas();//獲取目標畫圖區域
        canvas.drawColor(Color.RED);//畫布背景顏色   
        holder.unlockCanvasAndPost(canvas); //解除鎖定並顯示 
    } 
    
    private class MyThread extends Thread{
        
        public void run(){
            Canvas canvas=null;
            canvas=holder.lockCanvas();//獲取目標畫圖區域,無參數表示鎖定的是所有繪圖區
            canvas.drawColor(Color.RED);//畫布背景顏色設置
            canvas.drawCircle(100, 100, 50, paint_one);//以(100,100)爲圓心,畫一個半徑爲50像素的圓
            canvas.drawCircle(50, 50, 50, paint_two);
            holder.unlockCanvasAndPost(canvas); //解除鎖定並顯示 
        }   
    }
}
相關文章
相關標籤/搜索