SurfaceView的繪圖機制

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

相關文章
相關標籤/搜索