【问题标题】:Optimizations of custom ImageView that frequently refreshes by calling onDraw自定义ImageView调用onDraw频繁刷新的优化
【发布时间】:2011-06-01 09:28:13
【问题描述】:

我创建了一个自定义 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 个时,操作变得非常昂贵并且会降低应用程序的速度。

关于如何优化这个问题的任何解决方案?

  1. 能否在不同线程中调用 drawBitmap 降低操作开销?

  2. 有没有办法保留前一个画布的副本,然后在 onDraw 中简单地恢复它,而不是重新绘制所有位图?

  3. 问题本质上是用大量动态图像刷新视图及其优化。

【问题讨论】:

  • 嗨,Pravin 你有这个问题的解决方案吗,我也面临同样的问题。请分享你的发现。

标签: android android-layout android-imageview


【解决方案1】:

您应该创建一个Bitmap,其大小必须等于ImageView 的图像大小,并且只在此位图上从bitmapList 绘制所有位图一次。在每个onDraw() 调用中,您应该只绘制这个位图。当bitmapList 更改时,必须重新创建这个额外的位图。

【讨论】:

  • 感谢我尝试过的响应,它确实提高了性能,但是使用 traceview 表明现在创建 bufferCanvas 的方法需要花费时间。虽然这提高了性能,因为现在我不需要每次调用 onDraw 时都绘制所有位图,但当我需要刷新缓冲区时它仍然很慢。
  • 您可以尝试在每次需要刷新缓冲区时创建一个新缓冲区,并且可以从单独的线程中执行此操作。认为它会让你的应用运行得更快。
【解决方案2】:

您可以使用后缓冲图像在图像发生变化时将所有图像绘制到其中,然后在 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 ...);

【讨论】:

  • ...与@Pixie 给您的答案基本相同.. :)
猜你喜欢
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多