0

我正在实现全景查看器。我是用 ImageView 做的,在 AsyncTask 中用它的 Matrix 移动图像(foto是 ImageView,m是一个 Matrix):

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

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

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

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

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

首先,我创建了一个scaleBitmap缩放图像以适应窗口高度(这是为了避免重新缩放)和一个屏幕大小的位图fitBitmap。然后,我创建了两个屏幕大小相等的矩形,destRect并且srcRect. 现在,新的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();
        }
    }

还尝试在方法中注释/取消注释最后两行中的任何一个/两个,但没有运气。没有最后一个,什么都不会发生。

4

1 回答 1

0

在第二种情况下,它会使整个视图无效。这就是为什么。

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

正确的做法是这样的:

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

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

于 2013-01-05T22:53:42.267 回答