首页>
知识库>
详情

Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法

2020-07-03 来源:CloudBest 阅读量: 0
关键词:

    SurfaceView在Android中用作游戏开发是最适宜的,本文就将演示游戏开发中常用的两种绘图刷新策略在SurfaceView中的实现方法。

    bj.jpg就是一个渐变图,用作背景。
    question.png是一个半透明的图像,我们希望将它放在上面,围绕其圆心不断旋转。
    实现代码如下:
    package SkyD.SurfaceViewTest;
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.os.Bundle;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    public class Main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new MySurfaceView(this));
    }
    // 自定义的SurfaceView子类
    class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    // 背景图
    private Bitmap BackgroundImage;
    // 问号图
    private Bitmap QuestionImage;
    SurfaceHolder Holder;
    public MySurfaceView(Context context) {
    super(context);
    BackgroundImage = BitmapFactory.decodeResource(getResources(),
    R.drawable.bg);
    QuestionImage = BitmapFactory.decodeResource(getResources(),
    R.drawable.question);
    Holder = this.getHolder();// 获取holder
    Holder.addCallback(this);
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
    // TODO Auto-generated method stub
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    // 启动自定义线程
    new Thread(new MyThread())。start();
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    }
    // 自定义线程类
    class MyThread implements Runnable {
    @Override
    public void run() {
    Canvas canvas = null;
    int rotate = 0;// 旋转角度变量
    while (true) {
    try {
    canvas = Holder.lockCanvas();// 获取画布
    Paint mPaint = new Paint();
    // 绘制背景
    canvas.drawBitmap(BackgroundImage, 0, 0, mPaint);
    // 创建矩阵以控制图片旋转和平移
    Matrix m = new Matrix();
    // 设置旋转角度
    m.postRotate((rotate += 48) % 360,
    QuestionImage.getWidth() / 2,
    QuestionImage.getHeight() / 2);
    // 设置左边距和上边距
    m.postTranslate(47, 47);
    // 绘制问号图
    canvas.drawBitmap(QuestionImage, m, mPaint);
    // 休眠以控制最大帧频为每秒约30帧
    Thread.sleep(33);
    } catch (Exception e) {
    } finally {
    Holder.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像
    }
    }
    }
    }
    }
    }
    模拟器中的运行效果: