我在thread里的doDraw函数里面会根据一定的逻辑在canvas上只重绘需要变更的部分,比如更新一个小图标上去。
每次执行完unlockCanvasAndPost以后都会出现下面的现象:
第一次出现那个小图片,第二次其他以前绘制的部分出现 ,就这么不断循环,看起来有闪烁感。
感觉就像有个什么缓冲一样,一个是以前的画面,一个是刚画的画面,两个轮流显示
为什么呀? while(isRuning){
long now = System.currentTimeMillis();
if(now - mLasttime > refreshSpeed){
mLasttime = now;
Canvas c = null;
try{
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder){
this.doDraw(c);
}
}finally{
if(c != null){
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
每次执行完unlockCanvasAndPost以后都会出现下面的现象:
第一次出现那个小图片,第二次其他以前绘制的部分出现 ,就这么不断循环,看起来有闪烁感。
感觉就像有个什么缓冲一样,一个是以前的画面,一个是刚画的画面,两个轮流显示
为什么呀? while(isRuning){
long now = System.currentTimeMillis();
if(now - mLasttime > refreshSpeed){
mLasttime = now;
Canvas c = null;
try{
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder){
this.doDraw(c);
}
}finally{
if(c != null){
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
解决方案 »
- 来讨论一下Android里代码如何操作背景数据
- webview在启动时,有一个空白页面,这个空白页面如何换成动画的显示方式
- android解析json报空指针异常。
- ubuntu android开发环境的搭建
- android 控件 点击放大,关闭,缩小到原来大小
- android运行不报错,但是一启动AVD就强制关闭,帮忙检查一下下面程序有没有错
- 网络摄像头 软件终端app二次开发
- spinnner和适配器的问题
- ContentObserver 判断是 insert 还是delete 还是update 触发OnChange() 大家有什么办法吗
- 安卓编译的问题:clang++ error
- android中如何获取草稿箱中收件人的address
- 求助,哪位大哥帮我看下这个下载项目为什么下载不了文件呢?
我在这个canvas上绘制了整个画面
mSurfaceHolder.unlockCanvasAndPost(c) 会把刚绘制完的canvas更新到屏幕
下次再lockCanvas的时候,取到的是一个新canvas,
我在这个canvas上根据需要只重绘了一部分区域
所以unlockCanvasAndPost的时候就只显示被重绘了的部分因为这个处理在不断的循环,一会儿显示整个画面,一会儿显示画面的一部分
闪烁感就来了
http://blog.csdn.net/swingline/article/details/6044223surface为了让画面显示流畅无闪烁,使用了双缓冲机制。一个font buffer 一个back buffer.