Android SurfaceView

来源:互联网 发布:知敬畏存戒惧守底线 编辑:程序博客网 时间:2024/05/19 03:20

 今天介绍一下SurfaceView的用法,SurfaceView一般与SurfaceHolder结合使用,SurfaceHolder用于向与之关联的SurfaceView上绘图,调用SurfaceView的getHolder()方法即可获取SurfaceView关联的SurfaceHolder。

  SurfaceHolder提供一下几个方法来获取Canvas对象:

  CanvaslockCanvas():锁定整个SurfaceView对象,获取该Surface上的Canvas。

  Canvas lockCanvas(Rectdirty):锁定SurfaceView上Rect划分的区域,获取该Surface上的Canvas。

 当通过lockCanvas获取指定SurfaceView上的Canvas之后,接下来程序就可以调用Canvas进行绘图,绘图完成后,调用一下方法来释放绘图、提交所绘制的图形:

  unlockCanvasAndPost(canvas)。

  下面直接上个实例:

public class SurfaceViewTest extends Activity
{
 // SurfaceHolder负责维护SurfaceView上绘制的内容
 private SurfaceHolder holder;
 private Paint paint;
 @Override
 public void onCreate(BundlesavedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  paint = newPaint(); 
  SurfaceView surface =(SurfaceView) findViewById(R.id.show);
  // 初始化SurfaceHolder对象
  holder =surface.getHolder();
  holder.addCallback(newCallback()
  {
   @Override
   public voidsurfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
    intarg3)
   {
   }

   @Override
   public voidsurfaceCreated(SurfaceHolder holder)
   {
    //锁定整个SurfaceView
    Canvascanvas = holder.lockCanvas();
    //绘制背景
    Bitmapback = BitmapFactory.decodeResource(
     SurfaceViewTest.this.getResources(),R.drawable.sun);
    //绘制背景
    canvas.drawBitmap(back,0, 0, null);
    //绘制完成,释放画布,提交修改
    holder.unlockCanvasAndPost(canvas);
    //重新锁一次,"持久化"上次所绘制的内容
    holder.lockCanvas(newRect(0, 0, 0, 0));
    holder.unlockCanvasAndPost(canvas);
   }

   @Override
   public voidsurfaceDestroyed(SurfaceHolder holder)
   {
   }
  });
  //为surface的触摸事件绑定监听器
  surface.setOnTouchListener(newOnTouchListener()
  {
   @Override
   publicboolean onTouch(View source, MotionEvent event)
   {
    //只处理按下事件
    if(event.getAction() == MotionEvent.ACTION_DOWN)
    {
     intcx = (int) event.getX();
     intcy = (int) event.getY();
     //锁定SurfaceView的局部区域,只更新局部内容
     Canvascanvas = holder.lockCanvas(new Rect(cx - 50,
      cy- 50, cx + 50, cy + 50));
     //保存canvas的当前状态
     canvas.save();
     //旋转画布
     canvas.rotate(30,cx, cy);
     paint.setColor(Color.RED);
     //绘制红色方块
     canvas.drawRect(cx- 40, cy - 40, cx, cy, paint);
     //恢复Canvas之前的保存状态
     canvas.restore();
     paint.setColor(Color.GREEN);
     //绘制绿色方块
     canvas.drawRect(cx,cy, cx + 40, cy + 40, paint);
     //绘制完成,释放画布,提交修改
     holder.unlockCanvasAndPost(canvas);
    }
    returnfalse;
   }
  });
 }
}