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); //解除鎖定並顯示 } } }