在生产安卓设备有时需要用到产生一个纯颜色变换的画面,来测试LCD是否有坏点。一个简单的实例如下,要用到SurfaceView,SurfaceHolder,canvas等图层处理:
(1)要import的文件
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
(2)主activity的定义
public class MainActivity extends Activity implements SurfaceHolder.Callback,所以类中要完成SurfaceHolder的接口函数
用到的变量
private boolean mTestOver; //单次测试是否结束
private boolean mainThreadExitFlag; //线程结束标志
private SurfaceHolder mSurfaceHolder = null;
private SurfaceView mSurfaceView = null;
private static final int UPDATE_MSG = 1; //自定义消息
页面的onCreate内容
mainThreadExitFlag = false;
mSurfaceView = (SurfaceView) findViewById(R.id.lcd_preview);
SurfaceHolder holder = mSurfaceView.getHolder();
holder.addCallback(this); //绑定SurfaceView控件与SurfaceHolder
mTestOver = false;
结束测试的函数
private void destroy(int res)//return with result
{
mainThreadExitFlag = true; //
Intent mIntent = new Intent();
setResult(res, mIntent);
finish(); //结束该activity。但是发现任务管理器中该apk仍然存在,线程没结束?
}
需实现的三个接口函数
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
mSurfaceHolder = arg0;
}
public void surfaceCreated(SurfaceHolder holder) {
new Thread(new MyThread()).start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
mainThreadExitFlag = true;
mSurfaceHolder = null;
}
自定义消息的handler
private Handler mHandler = new Handler(){
public void handleMessage(Message msg){
switch (msg.what){
case UPDATE_MSG:
mTestOver = true; //一次完整测试结束
destroy(1);
break;
default:
super.handleMessage(msg);
}
}
};
测试结束后发出的消息
void update(){
mHandler.removeMessages(UPDATE_MSG);
mHandler.sendMessageDelayed(
mHandler.obtainMessage(UPDATE_MSG), 0);
}
测试过程的主线程
class MyThread implements Runnable{
void LcdDelay(){
try {
Thread.sleep(1000); //每种颜色延时1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
void DrawColor(Paint mpaint, int color){
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels; //获得当前LCD的宽高
if(mSurfaceHolder == null){
return;
}
Canvas canvas = mSurfaceHolder.lockCanvas(null);
mpaint.setColor(color);
canvas.drawRect(new RectF(0,0,width,height), mpaint); //在画布上以特定颜色画矩形
if(mSurfaceHolder != null){
mSurfaceHolder.unlockCanvasAndPost(canvas); //刷屏
}else{
return;
}
}
@Override
public void run() {
Paint mPaint = new Paint();
if(mainThreadExitFlag){ //如果中间有线程退出标志被置,退出当前线程
mTestOver = true;
return;
}
DrawColor(mPaint, Color.RED); //分别刷各种颜色
if(mainThreadExitFlag){
mTestOver = true;
return;
}
LcdDelay();
if(mainThreadExitFlag){
mTestOver = true;
return;
}
DrawColor(mPaint, Color.BLUE);
if(mainThreadExitFlag){
mTestOver = true;
return;
}
LcdDelay();
if(mainThreadExitFlag){
mTestOver = true;
return;
}
DrawColor(mPaint, Color.GREEN);
if(mainThreadExitFlag){
mTestOver = true;
return;
}
LcdDelay();
if(mainThreadExitFlag){
mTestOver = true;
return;
}
DrawColor(mPaint, Color.WHITE);
if(mainThreadExitFlag){
mTestOver = true;
return;
}
LcdDelay();
if(mainThreadExitFlag){
mTestOver = true;
return;
}
DrawColor(mPaint, Color.BLACK);
if(mainThreadExitFlag){
mTestOver = true;
return;
}
LcdDelay();
if(mainThreadExitFlag){
mTestOver = true;
return;
}
update(); //发出UPDATE消息,可以重新测试一次,也可以退出当前
}
}
上述APK运行后就可以产生纯色变换的画面