好几天前就想问了,关于双缓冲移动画面出现残影的问题。

oO桀骜 2012-04-12 05:21:00
大家好,这个问题前阵子就想问了,可是前几天csdn论坛关闭了,也没地方可以问。入正题。
主要问题就是我运用双缓冲来画瓦片组成的一整幅图,使用异步线程下载,每次移动后判定需要加载那几块图片,先查缓存,缓存里有直接取出画上去,缓存没有进入异步线程下载,下好了,画上去。我没有用surfaceview,直接在view上画使用canvas.drawbitmap(bitmap,x,y,null),之前出现了闪烁现象,使用双缓冲解决了闪烁,可是出现一个问题了,缓存里有的也就是加载过的我移动没有问题,很好,可是移动到没有加载过的,就是需要下载的地方,在没有下载好以前那些地方都是之前了留下的画面,等下载好了后他会自动刷新上去,这样造成了一个很不好的视觉感受,我想实现在没有下载好的地方直接给他填上空白,这样等下载好了再直接贴上去,而不要有之前留下的残影,我分析这个残影是双缓冲开始内存里那个图留下的,试了好几种方法了都不能解决,上来请教下大家,有没有什么好的建议?我贴下我的双缓冲部分代码。
预画图,就是内存里画图的部分

public void preDraw(Tile tile){
cacheCanvas.setBitmap(cacheBitmap);
Bitmap bitmap = tile.getBitmap();//获得要画的方块
Point scPt = tile.getScreenPos();//获得要画的方块需要画的位置
if(bitmap != null){
cacheCanvas.drawBitmap(bitmap, scPt.x, scPt.y, null);
}
map.invalidate();
Log.d("预画图完成", "显示至界面");
}

ondraw函数很简单的啦。。。

public void onDraw(Canvas canvas) {
canvas.drawBitmap(cacheBitmap, 0, 0, null);
Log.d("完成画图","ok");
}

我再贴个残影的图吧让大家知道我这个残影是什么个情况。






通过上面两张图大家应该能看出来是什么问题了吧?每次刚拖动时会这样,等后台下载好了会自动更新好,移动到之前已经看过的地方就不会又残影。。。
...全文
692 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mikite 2012-11-15
  • 打赏
  • 举报
回复
楼主是百度的?
zhu071011 2012-11-08
  • 打赏
  • 举报
回复
也就是说,你是用了两张图片,然后一张专门用来解决这个问题,还有的一张才是用来画自己想要的东西。
oO桀骜 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

敢问楼主是怎么解决的!
[/Quote]
主要就是用双缓冲,如果是残影我的解决办法是在还没下载好的地图位置使用背景色的图片暂时替代,等下载好了换会下载好的图片
MageZealot 2012-08-13
  • 打赏
  • 举报
回复
敢问楼主是怎么解决的!
dfqin 2012-04-17
  • 打赏
  • 举报
回复
两种解决方案:
1,既然你说缓存里有的,不会有问题,也就是说缓存里无论放的是地图还是你自己的图片,显示都不会出问题,所以,你在图片下载之前,你可以在缓存里放一张背景图片,百度,google,Mapabc 好像都是这么干的。
2. 你是不是一整个地图就是一个view? 我觉得从设计上来讲这不是个好的方案。整个地图可以为一个Container,每一小块地图是一个view,这样的话,从逻辑上更好控制。
oO桀骜 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

Java code
public void onDraw(Canvas canvas) {
canvas.drawColor(0x0);//清空画布
canvas.drawBitmap(cacheBitmap, 0, 0, null);
Log.d("完成画图","ok");
}
[/Quote]
这个不好使,倒不是你说的方法不行,可能是你的方法和我的处理逻辑不符合吧,不过问题已经解决了~谢谢大家~
oO桀骜 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

两种解决方案:
1,既然你说缓存里有的,不会有问题,也就是说缓存里无论放的是地图还是你自己的图片,显示都不会出问题,所以,你在图片下载之前,你可以在缓存里放一张背景图片,百度,google,Mapabc 好像都是这么干的。
2. 你是不是一整个地图就是一个view? 我觉得从设计上来讲这不是个好的方案。整个地图可以为一个Container,每一小块地图是一个view,这样的话,从逻辑上更好控……
[/Quote]


问题解决了,是你第一个那个思路来做的。~~~
kay_ 2012-04-17
  • 打赏
  • 举报
回复
   public void onDraw(Canvas canvas) {
canvas.drawColor(0x0);//清空画布
canvas.drawBitmap(cacheBitmap, 0, 0, null);
Log.d("完成画图","ok");
}
kay_ 2012-04-17
  • 打赏
  • 举报
回复
canvas.drawColor(0x0);
tianshenshangjie 2012-04-13
  • 打赏
  • 举报
回复
你可以用下卡马克方法。 或者你如果没有找到那块图片。你就直接画一个白色图片字上面。 出现你这种问题应该是你没有清空原来的地方
oO桀骜 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

是不是忘记清空画布了???
[/Quote]

没明白你的意思。请问在哪里清空 怎么清空?我是定义的全局变量cahebitmap 如果recycle会报我使用了一个recycle的bitmap对象,我刚学不久安卓,对你的这个意思没很明白。。。
oO桀骜 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

看逻辑应该是局部更新,而preDraw应该没有清除这个局部的画布,导致的重叠吧
[/Quote]

能请问下在哪里清楚吗?我试了recycle,提示会报空指针,能麻烦问下怎么清楚???我刚学安卓不久
danielinbiti 2012-04-13
  • 打赏
  • 举报
回复
看逻辑应该是局部更新,而preDraw应该没有清除这个局部的画布,导致的重叠吧
suren__123 2012-04-13
  • 打赏
  • 举报
回复
是不是忘记清空画布了???
oO桀骜 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

你可以用下卡马克方法。 或者你如果没有找到那块图片。你就直接画一个白色图片字上面。 出现你这种问题应该是你没有清空原来的地方
[/Quote]


我试过直接贴空白到没下载的地方去,可是都没有实现我要的效果哦,你觉得应该在那个地方添加比较合适?我想了想就以下几个地方,,,,,1.在异步线程下载时就空图片过去,2.在双缓冲的内存里那个图时,3.在双缓冲画到屏幕上时 对于第一个还没想明白,但是第二个应该是不可行的,因为在移动的过程中是不断重绘的,应该还是会有残影,第三个感觉就完全不行了觉得。。。哎,还是纠结,没想明白,我感觉丁马克算法这里就不考虑了,因为用按个的话整个画法都要改变,而且也确实没看懂。。。。现在这个画法就这个地方有问题,想解决这个问题。。。
oO桀骜 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

你可以用下卡马克方法。 或者你如果没有找到那块图片。你就直接画一个白色图片字上面。 出现你这种问题应该是你没有清空原来的地方
[/Quote]
是啊。我感觉也是因为没有清空内存里那个图导致的,昨天试了很久就是用空白的图片贴在没有下载好的地方可是没效果,可能是我用的不对,脑子疼啊。。你看我应该在哪里加比较合适?
oO桀骜 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

帮顶,我也遇到类似问题,待学习下。。
[/Quote]

你也是和我这种情况很像吗?解决了吗?
Asin60 2012-04-12
  • 打赏
  • 举报
回复
帮顶,我也遇到类似问题,待学习下。。
oO桀骜 2012-04-12
  • 打赏
  • 举报
回复
从发


oO桀骜 2012-04-12
  • 打赏
  • 举报
回复
靠 图挂了。。。我从新发上来,qq空间
不给力啊 我传百度先。。。


加载更多回复(1)

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧