我正在实现全景查看器。我是用 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();
}
}
还尝试在方法中注释/取消注释最后两行中的任何一个/两个,但没有运气。没有最后一个,什么都不会发生。