我正在实施全景查看器。我用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
。然后,我创建两个相等的屏幕大小的矩形,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();
}
}
试图在没有运气的情况下对方法中的最后两行进行评论/取消注释。没有最后,没有任何反应。
答案 0 :(得分:0)
它使第二种情况下的整个视图无效。这就是原因。
您根本不应使用setImageView
- 覆盖onDraw
并直接绘制位图。这会更快。
正确的方法如下:
onDraw
。这是一个指向窗口小部件的链接,当用户将手指移到表面上时绘制线条:link。它有点复杂,因为我使用两个位图,一个用于内部表示,另一个用于显示给用户。忽略它,看看我如何使用cache
位图。