surfaceView 学习之路

本文详细介绍了SurfaceView的概念及其在Android开发中的应用。SurfaceView提供直接访问绘图表面的能力,适用于需要直接绘制像素而非使用UI组件的应用场景。文章还探讨了SurfaceView的生命周期回调方法,包括surfaceCreated、surfaceChanged和surfaceDestroyed,并提供了具体的实现示例。

  1. surfaceView的概念
所有东西都是在Canvas(画布)中自行绘制出来的(背景,人物等)

SurfaceView提供直接访问一个可画图的界面,可以控制在界面顶部的子视图层。SurfaceView是提供给需要直接画像素而不是使用窗体部件的应用使用的。Android图形系统中一个重要的概念和线索是surface。View及其子类(如TextView, Button)

要画surface每个surface创建一个Canvas对象(但属性时常改变),用来管理viewsurface上的绘图操作,如画点画线。还要注意的是,使用它的时候,一般都是出现在最顶层的:The view hierarchy will take care of correctly compositing

with the Surface any siblings of the SurfaceView that would normally appear on top of it

2.创建,销毁,改变时的情况进行监视

//在surface的大小发生改变时激发

public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}
//在创建时激发,一般在这里调用画图的线程。
public void surfaceCreated(SurfaceHolder holder){}
//销毁时激发,一般在这里将画图的线程停止、释放。
public void surfaceDestroyed(SurfaceHolder holder) {}

  surfaceCreated会首先被调用,然后是surfaceChanged,当程序结束时会调用surfaceDestroyed


由于SurfaceHolder是一个共享资源,因此在对其操作时都应该实行“互斥操作“,即需要使synchronized进行封锁机制。

,渲染文字的工作实际上是主线程(也就是LunarView类)的父类View的工作,而并不属于工作线程LunarThread,因此在工作线程中式无法控制的。所以我们改为向主线程发送一个Message来代替,让主线程通过Handler对接收到的消息进行处理,从而更新界面文字信息。再回顾上一篇SnakeView里的文字信息更新,由于是SnakeView自己(就这一个线程)对其包含的TextView做控制,当然没有这样的问题了。


下面就是LunaThread这个工作线程的执行函数了,它一直不断在重复做一件事情:锁定待绘制区域(这里是整个屏幕),若游戏还在进行状态,则更新底层的数据,然后直接强制界面重新绘制。

 public void run() 

        {
            while (mRun) 
            {
                Canvas c = null;
                try 
                {
                    //锁定待绘制区域
                    c = mSurfaceHolder.lockCanvas(null);
                    synchronized (mSurfaceHolder)
                    {
                        if (mMode == STATE_RUNNING) 
                            updatePhysics();//更新底层数据,判断游戏状态
                        doDraw(c);//强制重绘制
                    }
                } 
                finally 
                {
                    if (c != null) {
                        mSurfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }

这里要注意的是最后要调用unlockCanvasAndPost来结束锁定画图,并提交改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值