标签:
1
/** * 整个过程:继承SurfaceView并实现SurfaceHolder.Callback接口 * ----> SurfaceView.getHolder()获得SurfaceHolder对象 * ---->SurfaceHolder.addCallback(callback)添加回调函数 * ---->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布 * ----> Canvas绘画 * ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。 * * 3、SurfaceHolder 这里用到了一个类SurfaceHolder,可以把它当成surface的控制器,用来操纵surface。 处理它的Canvas上画的效果和动画,控制表面,大小,像素等。 几个需要注意的方法: (1)、abstract void addCallback(SurfaceHolder.Callback callback); // 给SurfaceView当前的持有者一个回调对象。 (2)、abstract Canvas lockCanvas(); // 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。 (3)、abstract Canvas lockCanvas(Rect dirty); // 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。 // 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。 (4)、abstract void unlockCanvasAndPost(Canvas canvas); // 结束锁定画图,并提交改变。 */ public class BitmapView extends SurfaceView implements Callback{ private SurfaceHolder holder; private MyRunnable runnable = null; /**
在线程中执行绘制的操作
*/ public class MyRunnable implements Runnable{ private SurfaceHolder myholder; public boolean isRun; public MyRunnable (SurfaceHolder myholder){ this.myholder = myholder; } public void run() { int count = 0; while(isRun){ Canvas c = null; try { synchronized (myholder) { c = myholder.lockCanvas();//锁定画布, 获取画布对象,进行画图等操作, c.drawColor(Color.BLACK); Paint paint = new Paint();//创建画笔 paint.setColor(Color.RED);//设置画笔颜色 Rect r = new Rect(100, 50, 150, 300); c.drawRect(r, paint); c.drawText( "这是第"+(count++)+"秒", 100, 310, paint); Thread.sleep(1000); } } catch (Exception e) { e.printStackTrace(); }finally { if (c != null){ holder.unlockCanvasAndPost(c);//结束画图,提交改变 } } } }; }; public BitmapView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public BitmapView(Context context, AttributeSet attrs) { super(context, attrs); } public BitmapView(Context context) { super(context); holder = this.getHolder();//获取SurfaceHolder对象 holder.addCallback(this);//添加回调函数 } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO 在surface的大小发生改变时激发 } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO 在创建时激发,一般在这里调用画图的线程。 runnable = new MyRunnable(holder); runnable.isRun = true; new Thread(runnable).start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO 销毁时激发,一般在这里将画图的线程停止、释放。 runnable.isRun = false; } }
2
Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系
标签:
原文地址:http://www.cnblogs.com/chengbao/p/5634991.html