码迷,mamicode.com
首页 > 移动开发 > 详细

Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系

时间:2016-07-02 11:49:33      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!