在生产安卓设备有时需要用到产生一个纯颜色变换的画面,来测试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;
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; //自定义消息
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;
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仍然存在,线程没结束?
- }
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;
- }
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);
- }
- }
- };
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);
- }
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消息,可以重新测试一次,也可以退出当前
- }
- }