大家好,这个问题前阵子就想问了,可是前几天csdn论坛关闭了,也没地方可以问。入正题。
主要问题就是我运用双缓冲来画瓦片组成的一整幅图,使用异步线程下载,每次移动后判定需要加载那几块图片,先查缓存,缓存里有直接取出画上去,缓存没有进入异步线程下载,下好了,画上去。我没有用surfaceview,直接在view上画使用canvas.drawbitmap(bitmap,x,y,null),之前出现了闪烁现象,使用双缓冲解决了闪烁,可是出现一个问题了,缓存里有的也就是加载过的我移动没有问题,很好,可是移动到没有加载过的,就是需要下载的地方,在没有下载好以前那些地方都是之前了留下的画面,等下载好了后他会自动刷新上去,这样造成了一个很不好的视觉感受,我想实现在没有下载好的地方直接给他填上空白,这样等下载好了再直接贴上去,而不要有之前留下的残影,我分析这个残影是双缓冲开始内存里那个图留下的,试了好几种方法了都不能解决,上来请教下大家,有没有什么好的建议?我贴下我的双缓冲部分代码。
预画图,就是内存里画图的部分
- Java code
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函数很简单的啦。。。
- Java code
public void onDraw(Canvas canvas) { canvas.drawBitmap(cacheBitmap, 0, 0, null); Log.d("完成画图","ok"); }
我再贴个残影的图吧让大家知道我这个残影是什么个情况。
通过上面两张图大家应该能看出来是什么问题了吧?每次刚拖动时会这样,等后台下载好了会自动更新好,移动到之前已经看过的地方就不会又残影。。。
------解决方案--------------------
是不是忘记清空画布了???
------解决方案--------------------
看逻辑应该是局部更新,而preDraw应该没有清除这个局部的画布,导致的重叠吧
------解决方案--------------------
两种解决方案:
1,既然你说缓存里有的,不会有问题,也就是说缓存里无论放的是地图还是你自己的图片,显示都不会出问题,所以,你在图片下载之前,你可以在缓存里放一张背景图片,百度,google,Mapabc 好像都是这么干的。
2. 你是不是一整个地图就是一个view? 我觉得从设计上来讲这不是个好的方案。整个地图可以为一个Container,每一小块地图是一个view,这样的话,从逻辑上更好控制。
------解决方案--------------------
canvas.drawColor(0x0);