我制作了一个全景应用程序,可以自动滚动图像,从左到右依次滚动,依此类推。它工作得很好,除了它不像我想的那样平滑地滚动(意味着恒定的速度)。它有时会“跳”一点。它不应该在核心为1.4 GHz的设备中......
我只是通过翻译图像来实现这一点,然后等待Thread.sleep(panoanimspeed);
(其中1 / 1000s< = panoanimspeed< = 1/50秒),依此类推。可能不是最聪明的事情......?
你知道我怎样才能让这个更顺畅?下面是相关AsyncTask的代码。
谢谢!
class AnimatePanorama extends AsyncTask<Void, Integer, Void> {
private float scale = foto.getCropScale() * foto.getBaseScale();
private Matrix m = foto.matrix;
@Override
protected void onProgressUpdate(Integer... values) {
if (values[0] == 0) {
m.setScale(scale, scale);
m.postTranslate(values[1], 0);
foto.setImageMatrix(m);
}
}
@Override
protected Void doInBackground(Void... arg) {
dir = -dir;
int l, ini = 0;
float lim = foto.getImageWidth()*scale - foto.getViewWidth();
float[] mm = new float[9];
foto.matrix.getValues(mm);
if (foto.getScale() == foto.getCropScale())
ini = (int) (dir*(lim*(dir+1)/2 + mm[2]));
while (true) {
if(isCancelled()) break;
l = (int) (lim*(dir+1)/2);
for (int i = ini; i < lim; i++) {
if(isCancelled()) break;
try {
Thread.sleep(panoanimspeed);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(0, dir * i - l);
}
ini = 0;
dir = -dir;
}
return null;
}
}
答案 0 :(得分:0)
通过扩展动画类(http://developer.android.com/reference/android/view/animation/Animation.html)创建动画
并覆盖applyTransformation(float interpolatedTime, Transformation t)
方法。
答案 1 :(得分:0)
将图像翻译基于“基于实时”的翻译,例如每秒X像素。
在第一个周期中,将系统时间保存为基准时间戳。
在未来的循环周期中,根据自基准时间戳以来的时间计算新位置。
这将避免Thread.sleep“真实世界”时机的不可靠性。