public class SurfaceViewTest extends Activity { //SurfaceHolder負責維護SurfaceView上繪製的內容 private SurfaceHolder holder; private Paint paint; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.surface); paint=new Paint(); SurfaceView surface=(SurfaceView) findViewById(R.id.surface); //初始化SurfaceView對象 holder=surface.getHolder(); holder.addCallback(new Callback() { @Override public void surfaceDestroyed(SurfaceHolder arg0) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder arg0) { // TODO Auto-generated method stub //鎖定整個SurfaceView Canvas canvas=holder.lockCanvas(); //繪製背景 Bitmap back=BitmapFactory.decodeResource(SurfaceViewTest.this.getResources(), R.drawable.ic_launcher); canvas.drawBitmap(back, 0,0, null); //繪製完成,釋放畫布,提交修改 holder.unlockCanvasAndPost(canvas); //從新鎖一次,「持久化」上次所繪製的內容 holder.lockCanvas(new Rect(0, 0, 0, 0)); holder.unlockCanvasAndPost(canvas); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } }); //爲SurfaceView綁定監聽事件 surface.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { // TODO Auto-generated method stub //按下的事件 if(arg1.getAction()==MotionEvent.ACTION_DOWN){ int cx=(int) arg1.getX(); int cy=(int) arg1.getY(); //鎖定SurfaceView的局部區域,只更新局部 Canvas canvas=holder.lockCanvas(new Rect(cx-50, cy-50, cx+50, cy+50)); //保存當前的狀態 canvas.save(); canvas.rotate(30, cx, cy); paint.setColor(Color.GREEN); canvas.drawRect(cx-40, cy-40, cx, cy, paint); canvas.restore(); paint.setColor(Color.RED); canvas.drawRect(cx, cy, cx+40, cy+40, paint); holder.unlockCanvasAndPost(canvas); } return false; } }); } }
SurfaceView通常會與SurfaceHolder結合使用,SurfaceHolder用於向與之關聯的SurfaceView上繪圖,調用SurfaceView的getHolder()方法便可獲取SurfaceView關聯的SurfaceHolder。canvas
SurfaceHolder提供了以下方法來獲取Canvas對象。ide
Canvas lockCanvas():鎖定SurfaceView對象,獲取Surface上的Canvas。this
Canvas lockCanvas(Rect dirty):鎖定SurfaceView上Rect劃分的區域,獲取該Surface上的Canvas。spa
unlockCanvasAndPost(canva);rest
須要指出的是,當調用SurfaceHolder的 unlockCanvasAndPost方法以後,該方法以前繪製的圖形還處於緩衝之中,下一次lockCanvas()方法鎖定的區域可能會「遮擋」它。code