现在的位置: 首页 > 综合 > 正文

surfaceView 学习之路

2013年12月03日 ⁄ 综合 ⁄ 共 1835字 ⁄ 字号 评论关闭

  1. surfaceView的概念

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

SurfaceView提供直接访问一个可画图的界面,可以控制在界面顶部的子视图层。SurfaceView是提供给需要直接画像素而不是使用窗体部件的应用使用的。Android图形系统中一个重要的概念和线索是surfaceView及其子类(如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来结束锁定画图,并提交改变

抱歉!评论已关闭.