我创建了一个自定义ImageView,在其onDraw方法中,我需要根据用户交互(如触摸)绘制一些位图。随着我开始添加越来越多的位图,应用程序真的变慢了,一切都运行得很好。
这就是我在自定义ImageView的onDraw中所做的事情
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.e(TAG, "onDraw called");
for (int i=0; i < bitmapList.size(); i++){
drawBitmap(canvas, bitmapList.get(i));
}
}
正如你所看到的,每当onDraw被自动调用时,我会重新绘制List中的所有位图,当位图数超过4-5时,操作变得非常昂贵并且减慢了应用程序的速度。
关于如何优化这个问题的任何解决方案?
可以在不同的线程中调用drawBitmap使操作更便宜吗?
有没有办法保留上一个画布的副本,然后只需在onDraw中恢复它,而不是再次绘制所有位图?
问题基本上是刷新视图,其中包含大量动态图像及其优化。
答案 0 :(得分:3)
您应该创建一个Bitmap
,其大小必须等于ImageView
的图像大小,并且只在此位图上的bitmapList
绘制一次所有位图。在每次onDraw()
调用时,您应该只绘制此位图。当bitmapList
发生更改时,必须重新创建此附加位图。
答案 1 :(得分:1)
你可以使用后备缓冲图像在你改变时将所有图像绘制成,然后在onDraw()
中仅将后备缓冲图像绘制到屏幕上// create backbuffer and draw it as seldom as possible
final Bitmap bufferBitmap = Bitmap.createBitmap(320, 240, Bitmap.Config.ARGB_8888);
final Canvas bufferCanvas = new Canvas(bufferBitmap);
for (int i=0; i < bitmapList.size(); i++){
drawBitmap(bufferCanvas, bitmapList.get(i));
}
// draw the buffered image as often as needed
canvas.drawBitmap(bufferBitmap ...);