Как мне сделать анимацию изображения более плавной?
Я сделал приложение для панорамы, которое автоматически прокручивает изображение слева направо и так далее. Он работает хорошо, за исключением того факта, что он не так плавно прокручивается (что означает постоянную скорость), как мне бы хотелось. Иногда он немного "прыгает". Это не должно быть в устройстве с ядром 1,4 ГГц...
Я реализовал это, просто переведя изображение, а затем немного подождав с Thread.sleep(panoanimspeed);
(где 1/1000 с <= 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;
}
}
2 ответа
Основывайте перевод изображений на основе перевода в реальном времени, например, X пикселей в секунду.
В первом цикле сохраните системное время как отметку базового времени.
В будущих циклах цикла вычислите новое местоположение на основе времени с базовой отметки времени.
Это позволит избежать ненадежности синхронизации реального мира Thread.sleep.
Создайте анимацию, расширив класс Animation ( http://developer.android.com/reference/android/view/animation/Animation.html) и переопределив applyTransformation(float interpolatedTime, Transformation t)
метод.