设为首页 加入收藏

TOP

Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法(一)
2014-11-24 14:24:11 来源: 作者: 【 】 浏览:4
Tags:Android SurfaceView 绘图 覆盖 刷新 矩形 方法

首先我们来看一下本例需要用到的两个素材图片:


Android


Android


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);// 解锁画布,提交画好的图像


}


}


}



}



}


}


模拟器中的运行效果:


Android


(注:图中的问号图形是在不断旋转中的)


这看起来不错,但是有一个问题:我们在代码中设置的帧频最大值是每秒30帧,而实际运行时的帧频根据目测就能看出是到不了30帧的,这是因为程序在每一帧都要对整个画面进行重绘,过多的时间都被用作绘图处理,所以难以达到最大帧频。



接下来我们将采取脏矩形刷新的方法来优化性能,所谓脏矩形刷新,意为仅刷新有新变化的部分所在的矩形区域,而其他没用的部分就不去刷新,以此来减少资源浪费。


我们可以通过在获取Canvas画布时,为其指派一个参数来声明我们需要画布哪个局部,这样就可以只获得这个部分的控制权:


Android


在这里为了便于观察,我将矩形区域设定为问号图形的1/4区域,也就是说在整个画面中我们仅仅更新问号图

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 一个简单手机响铃功能实现 下一篇Android知识:SurfaceView,Surfac..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: