surfaceView

子线程一改变作画内容,改变一次休眠一次:
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里面要关掉两个子线程
posted @   帅气好男人_jack  阅读(3)  评论(0编辑  收藏  举报  
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示