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

SurfaceView双缓冲

2013年10月07日 ⁄ 综合 ⁄ 共 2312字 ⁄ 字号 评论关闭

当需要开发复杂的游戏,而且对游戏执行效率很高时,view就不能满足了,这时必须使用SurfaceView类进行开发。SurfaceView可以直接访问画布(Canvas)。使用SurfaceView开发时需注意使用它绘图时一般都是在最顶层使用时还需要对其进行创建、销毁、情况改变时进行监视,这就要实现SurfaceHolder.Callback接口,如果要对被绘制的画布进行裁剪,控制其大小时都是需要使用SurfaceHolder来完成处理。在程序中SurfaceHolder对象需要通过getHolder方法获得,同时还需addCallback方法来添加回调函数
SurfaceView和View最明显的不同之处在于,SurfaceView不需要通过线程来更新视图,但在绘制前必须使用lockCanvas方法锁定画布,并得到画布,然后在绘制,绘制完成后使用unlockCanvasAndPost方法解锁画布

surfaceCreated:surface创建时激发
surfaceChangedsurface改变时激发
surfaceDestroyedsurface销毁时激发
addCallback给surfaceView添加一个回调函数
lockCanvas锁定画布,绘图之前必须锁定画布才能得到当前画布对象
unlockCanvasAndPost开始绘制时锁定了画布,绘制完成之后解锁画布
removeCallback移除SurfaceView回调函数

package surfaceview.yb;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;

/**
 * @author yubin
 * @version 2012-8-9 上午09:06:08
 **/
public class Gamesurfaceview extends SurfaceView implements Callback, Runnable {
    // 控制循环
    boolean mbLoop = false;

    SurfaceHolder mSurfaceHolder = null;
    int miCount = 0;
    int x = 50, y = 50;

    public Gamesurfaceview(Context context) {
        super(context);
        // 得到SurfaceHolder实例
        mSurfaceHolder = this.getHolder();
        // 添加回调函数 创建修改销毁方法
        mSurfaceHolder.addCallback(this);
        // 只有当该View获得焦点时才会调用onKeyDown方法
        this.setFocusable(true);
        mbLoop = true;
    }

    @Override
    public void run() {
        while(mbLoop) {
            try {
                Thread.sleep(200);
            }
            catch(Exception e) {
            }
            synchronized(mSurfaceHolder) {
                Draw();
            }
        }
    }

    private void Draw() {
        // 锁定画布,得到Canvas
        Canvas canvas = mSurfaceHolder.lockCanvas();
        if(miCount < 100) {
            miCount++;
        }
        else {
            miCount = 0;
        }
        // 设置画笔
        Paint mpaint = new Paint();
        // 设置无锯齿
        mpaint.setAntiAlias(true);
        mpaint.setColor(Color.BLACK);
        // 清屏
        canvas.drawRect(0, 0, 320, 480, mpaint);
        switch(miCount % 4) {
            case 0:
                mpaint.setColor(Color.BLUE);
                break;
            case 1:
                mpaint.setColor(Color.GREEN);
                break;
            case 2:
                mpaint.setColor(Color.RED);
                break;
            case 3:
                mpaint.setColor(Color.YELLOW);
                break;
            default:
                mpaint.setColor(Color.WHITE);
                break;
        }
        // 画实心矩形
        canvas.drawCircle((320 - 25) / 2, y, 50, mpaint);
        // 解锁画布绘制
        mSurfaceHolder.unlockCanvasAndPost(canvas);
    }

    // surface创建时激发
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 开启绘图线程
        new Thread(this).start();
    }

    // surface改变时激发
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub

    }

    // surface销毁时激发
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // 停止循环
        mbLoop = false;
    }

}

抱歉!评论已关闭.