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

一个测试LCD的activity

2014年11月22日 ⁄ 综合 ⁄ 共 6771字 ⁄ 字号 评论关闭

在生产安卓设备有时需要用到产生一个纯颜色变换的画面,来测试LCD是否有坏点。一个简单的实例如下,要用到SurfaceView,SurfaceHolder,canvas等图层处理:

(1)要import的文件

  1. import android.os.Bundle;  
  2. import android.os.Handler;  
  3. import android.os.Message;  
  4. import android.app.Activity;  
  5. import android.content.Intent;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Color;  
  8. import android.graphics.Paint;  
  9. import android.graphics.RectF;  
  10. import android.util.DisplayMetrics;  
  11. import android.util.Log;  
  12. import android.view.SurfaceHolder;  
  13. 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的接口函数

用到的变量

  1. private boolean mTestOver;      //单次测试是否结束
      
  2.     private boolean mainThreadExitFlag;     //线程结束标志
      
  3.     private SurfaceHolder mSurfaceHolder = null;  
  4.     private SurfaceView mSurfaceView = null;  
  5.     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内容

  1. mainThreadExitFlag = false;  
  2.         mSurfaceView = (SurfaceView) findViewById(R.id.lcd_preview);  
  3.         SurfaceHolder holder = mSurfaceView.getHolder();  
  4.         holder.addCallback(this);       //绑定SurfaceView控件与SurfaceHolder
      
  5.         mTestOver = false;  
mainThreadExitFlag = false;
		mSurfaceView = (SurfaceView) findViewById(R.id.lcd_preview);
		SurfaceHolder holder = mSurfaceView.getHolder();
		holder.addCallback(this);		//绑定SurfaceView控件与SurfaceHolder
		mTestOver = false;

结束测试的函数

  1. private void destroy(int res)//return with result
      
  2.     {  
  3.         mainThreadExitFlag = true;      //
      
  4.         Intent mIntent = new Intent();  
  5.         setResult(res, mIntent);  
  6.         finish();       //结束该activity。但是发现任务管理器中该apk仍然存在,线程没结束?
      
  7.     }  
private void destroy(int res)//return with result
	{
		mainThreadExitFlag = true;		//
		Intent mIntent = new Intent();
		setResult(res, mIntent);
		finish();		//结束该activity。但是发现任务管理器中该apk仍然存在,线程没结束?
	}

需实现的三个接口函数

  1. public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {  
  2.     mSurfaceHolder = arg0;  
  3. }  
  4. public void surfaceCreated(SurfaceHolder holder) {  
  5.     new Thread(new MyThread()).start();  
  6. }  
  7. public void surfaceDestroyed(SurfaceHolder holder) {  
  8.     mainThreadExitFlag = true;  
  9.     mSurfaceHolder = null;  
  10. }  
	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

  1. private Handler mHandler = new Handler(){  
  2.     public void handleMessage(Message msg){  
  3.         switch (msg.what){  
  4.         case UPDATE_MSG:  
  5.             mTestOver = true;       //一次完整测试结束
      
  6.             destroy(1);  
  7.             break;  
  8.             default:  
  9.                 super.handleMessage(msg);  
  10.         }  
  11.     }  
  12. };  
	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);
			}
		}
	};

测试结束后发出的消息

  1. void update(){  
  2.     mHandler.removeMessages(UPDATE_MSG);  
  3.     mHandler.sendMessageDelayed(  
  4.             mHandler.obtainMessage(UPDATE_MSG), 0);  
  5. }  
	void update(){
		mHandler.removeMessages(UPDATE_MSG);
		mHandler.sendMessageDelayed(
				mHandler.obtainMessage(UPDATE_MSG), 0);
	}

测试过程的主线程

  1. class MyThread implements Runnable{  
  2.         void LcdDelay(){  
  3.             try {                     
  4.                Thread.sleep(1000);  //每种颜色延时1秒
      
  5.             } catch (InterruptedException e) {    
  6.                e.printStackTrace();    
  7.             }  
  8.         }  
  9.           
  10.         void DrawColor(Paint mpaint, int color){      
  11.             DisplayMetrics displayMetrics = new DisplayMetrics();  
  12.             getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);  
  13.             int height = displayMetrics.heightPixels;  
  14.             int width = displayMetrics.widthPixels; //获得当前LCD的宽高
      
  15.             if(mSurfaceHolder == null){  
  16.                 return;  
  17.             }  
  18.             Canvas canvas = mSurfaceHolder.lockCanvas(null);  
  19.             mpaint.setColor(color);  
  20.             canvas.drawRect(new RectF(0,0,width,height), mpaint);   //在画布上以特定颜色画矩形
      
  21.   
  22.             if(mSurfaceHolder != null){  
  23.                 mSurfaceHolder.unlockCanvasAndPost(canvas); //刷屏    
      
  24.             }else{  
  25.                 return;  
  26.             }  
  27.         }  
  28.           
  29.         @Override  
  30.         public void run() {   
  31.             Paint mPaint = new Paint();  
  32.             if(mainThreadExitFlag){ //如果中间有线程退出标志被置,退出当前线程
      
  33.                 mTestOver = true;  
  34.                 return;  
  35.             }  
  36.             DrawColor(mPaint, Color.RED);   //分别刷各种颜色
      
  37.             if(mainThreadExitFlag){  
  38.                 mTestOver = true;  
  39.                 return;  
  40.             }  
  41.             LcdDelay();  
  42.             if(mainThreadExitFlag){  
  43.                 mTestOver = true;  
  44.                 return;  
  45.             }  
  46.             DrawColor(mPaint, Color.BLUE);  
  47.             if(mainThreadExitFlag){  
  48.                 mTestOver = true;  
  49.                 return;  
  50.             }  
  51.             LcdDelay();  
  52.             if(mainThreadExitFlag){  
  53.                 mTestOver = true;  
  54.                 return;  
  55.             }  
  56.             DrawColor(mPaint, Color.GREEN);  
  57.             if(mainThreadExitFlag){  
  58.                 mTestOver = true;  
  59.                 return;  
  60.             }  
  61.             LcdDelay();  
  62.             if(mainThreadExitFlag){  
  63.                 mTestOver = true;  
  64.                 return;  
  65.             }  
  66.             DrawColor(mPaint, Color.WHITE);  
  67.             if(mainThreadExitFlag){  
  68.                 mTestOver = true;  
  69.                 return;  
  70.             }  
  71.             LcdDelay();  
  72.             if(mainThreadExitFlag){  
  73.                 mTestOver = true;  
  74.                 return;  
  75.             }  
  76.             DrawColor(mPaint, Color.BLACK);  
  77.             if(mainThreadExitFlag){  
  78.                 mTestOver = true;  
  79.                 return;  
  80.             }  
  81.             LcdDelay();  
  82.             if(mainThreadExitFlag){  
  83.                 mTestOver = true;  
  84.                 return;  
  85.             }  
  86.             update();       //发出UPDATE消息,可以重新测试一次,也可以退出当前
      
  87.         }  
  88.           
  89.     }  

抱歉!评论已关闭.