为什么我的画布动画比简单的ImageView +矩阵慢?

时间:2013-01-05 19:09:49

标签: android animation android-asynctask android-canvas

我正在实施全景查看器。我用ImageView做了,用AsyncTask中的Matrix移动图像(foto是ImageView,m是矩阵):

    protected void onProgressUpdate(Integer... values) {
        if (values[0] == 0) {
            m.setScale(scale, scale);
            m.postTranslate(values[1], 0);
            foto.setImageMatrix(m);
        }
    }

它运作得很好,除了运动不是很平滑(平滑=恒定速度,特别是没有“跳跃”而没有“停止”)。

寻找解决方案,我在有关Canvas的文档中阅读:

选项“b”,绘制到Canvas,当您的应用程序需要定期重新绘制时更好。视频游戏等应用程序应该自行绘制到Canvas。

看起来这正是我需要的!所以我做了以下事情:

首先,我创建了一个scaleBitmap,图像缩放以适应窗口的高度(这是为了避免重新调整),以及屏幕大小的位图fitBitmap。然后,我创建两个相等的屏幕大小的矩形,destRectsrcRect。现在,新的onProgressUpdate() AsyncTask方法是:

    protected void onProgressUpdate(Integer... values) {
        if (values[0] == 0) {
            srcRect.offset(-1, 0);
            canvas.drawBitmap(scaledBitmap, srcRect, destRect, null);
            foto.setImageBitmap(fitBitmap);
        }
    }

这也有效。但它比以前慢多了!不仅如此,除非我将速度设置得非常低,否则它会'跳过'很多帧。可怕!但根据文档,Canvas可以加速动画。所以我做的事情非常糟糕。

你能告诉我哪个是我的错误,或者如何更好地实现这个?

谢谢!

修改

基于(我所了解的)@aragaer的建议,我尝试了以下,没有运气(仍然缓慢和跳跃):

    @Override
    protected void onProgressUpdate(Integer... values) {
        if (values[0] == 0) {
            m.setScale(scale, scale);
            m.postTranslate(values[1], 0);
            canvas.drawBitmap(myBitmap, m, null);
            canvas.drawBitmap(fitBitmap, 0, 0, null);
            foto.invalidate();
        }
    }

试图在没有运气的情况下对方法中的最后两行进行评论/取消注释。没有最后,没有任何反应。

1 个答案:

答案 0 :(得分:0)

它使第二种情况下的整个视图无效。这就是原因。

您根本不应使用setImageView - 覆盖onDraw并直接绘制位图。这会更快。

正确的方法如下:

  • 您可以创建自己的位图,其大小与您要使用的视图相同。
  • 您创建一个画布并将其设置为绘制到该位图。
  • 当你需要绘制的东西时,你会在画布中绘制东西。知道确切的更改矩形会使视图的矩形无效。在您将缓存位图绘制到提供的画布中时会调用onDraw

这是一个指向窗口小部件的链接,当用户将手指移到表面上时绘制线条:link。它有点复杂,因为我使用两个位图,一个用于内部表示,另一个用于显示给用户。忽略它,看看我如何使用cache位图。