您的位置:首页 > 其它

surfaceView

2015-10-15 23:05 211 查看
子线程一改变作画内容,改变一次休眠一次:
public class WelcomeViewGoThread extends Thread{
	WelcomeView welcomeView;
	private int sleepPan = 150;
	private boolean flag = true;			//循环标志
	public WelcomeViewGoThread(WelcomeView welcomeView) {
		this.welcomeView = welcomeView;
	}
	@Override
	public void run() {
		while(flag){
			welcomeView.drawIndex++;			//图片序号自驾
			if(welcomeView.drawIndex > welcomeView.bitmapsID.length-1){
				welcomeView.drawIndex = welcomeView.bitmapsID.length - 10;	//防止数组越界
			}
			if(welcomeView.drawIndex % 5 == 0){
				welcomeView.drawString = !welcomeView.drawString;
			}
			try {
				Thread.sleep(sleepPan);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public void setFlag(boolean flag){
		this.flag = flag;
	}
}
子线程二:
public class WelcomeViewDrawThread extends Thread{
	WelcomeView welcomeView;		//使用它的类的引用
	private int sleepPan = 100;			
	private boolean flag = true;	//循环标志
	private SurfaceHolder surfaceHolder;		//SufaceHolder的引用
	public WelcomeViewDrawThread(WelcomeView welcomeView) {
		this.welcomeView = welcomeView;
		surfaceHolder = welcomeView.getHolder();			//得到surfaceHolder的引用
	}
	@Override
	public void run() {
		Canvas c;				//申明画布
		while(flag){
			c = null;
			try{
				//锁定整个画布
				c = this.surfaceHolder.lockCanvas();
				synchronized(this.surfaceHolder){		//同步
					welcomeView.onDraw(c);
				}
			}finally {
				if(c != null){		//更新显示屏幕新内容
					this.surfaceHolder.unlockCanvasAndPost(c);
				}
			}
			try {
				Thread.sleep(sleepPan);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void setFlag(boolean flag){
		this.flag = flag;
	}
}


SurfaceView由于可以直接从内存或者DMA等硬件接口取得图像数据,因此是个非常重要的绘图容器,

SurfaceHolder回调可以在底层的Surface被创建和销毁的时候通知View,并传递给它对SurfaceHolder对象的引用,其中包含了当前有效的Surface。

使用方法:

SurfaceView都是配合线程来使用的,在子线程上作画,主线程上显示

public class WelcomeView extends SurfaceView implements SurfaceHolder.Callback{

KLSDActivity activity;
//主线程对象引用

WelcomeViewDrawThread welcomeViewDrawThread;
//欢迎刷真线程

WelcomeViewGoThread welcomeViewGoThread;
//动画生成线程

}

最后收尾工作:

在surfaceView的销毁方法surfaceDestroyed里面要关掉两个子线程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: