Фон
Я работаю над реализацией Эффект KenBurns "(demo здесь) на панели действий, как показано на этот образец библиотеки (за исключением значка, который перемещается, что я сделал сам).
На самом деле, я даже давно об этом спросил ( здесь), который в этот момент я даже не знал его имя. Я был уверен, что нашел решение, но у него есть некоторые проблемы.
Кроме того, поскольку я иногда показываю изображения с устройства, некоторые из них даже нужно поворачивать, поэтому я использую rotatableDrawable (как показано здесь).
Проблема
Текущая реализация не может обрабатывать несколько растровых изображений, которые предоставляются динамически (например, из Интернета) и даже не смотрят на размер входных изображений.
Вместо этого он просто выполняет масштабирование и перевод случайным образом, поэтому он может многократно увеличивать/уменьшать масштаб, и могут отображаться пустые пространства.
Код
Вот код, связанный с проблемами:
private float pickScale() {
return MIN_SCALE_FACTOR + this.random.nextFloat() * (MAX_SCALE_FACTOR - MIN_SCALE_FACTOR);
}
private float pickTranslation(final int value, final float ratio) {
return value * (ratio - 1.0f) * (this.random.nextFloat() - 0.5f);
}
public void animate(final ImageView view) {
final float fromScale = pickScale();
final float toScale = pickScale();
final float fromTranslationX = pickTranslation(view.getWidth(), fromScale);
final float fromTranslationY = pickTranslation(view.getHeight(), fromScale);
final float toTranslationX = pickTranslation(view.getWidth(), toScale);
final float toTranslationY = pickTranslation(view.getHeight(), toScale);
start(view, KenBurnsView.DELAY_BETWEEN_IMAGE_SWAPPING_IN_MS, fromScale, toScale, fromTranslationX,
fromTranslationY, toTranslationX, toTranslationY);
}
И вот часть самой анимации, которая оживляет текущий ImageView:
private void start(View view, long duration, float fromScale, float toScale, float fromTranslationX, float fromTranslationY, float toTranslationX, float toTranslationY) {
view.setScaleX(fromScale);
view.setScaleY(fromScale);
view.setTranslationX(fromTranslationX);
view.setTranslationY(fromTranslationY);
ViewPropertyAnimator propertyAnimator = view.animate().translationX(toTranslationX).translationY(toTranslationY).scaleX(toScale).scaleY(toScale).setDuration(duration);
propertyAnimator.start();
}
Как вы можете видеть, это не касается размеров представления/растровых изображений и просто случайным образом выбирает, как масштабировать и панорамировать.
Что я пробовал
Я работал с динамическими растровыми изображениями, но я не понимаю, что изменить на нем, чтобы он правильно обрабатывал размеры.
Я также заметил, что есть другая библиотека ( здесь), которая выполняет эту работу, но она также имеет те же проблемы, и еще труднее понять, как их исправить. Плюс он случайным образом падает. Вот сообщение, о котором я сообщил об этом.
Вопрос
Что делать, чтобы правильно реализовать эффект Кена-Бернса, чтобы он мог обрабатывать динамически созданные растровые изображения?
Я думаю, что, возможно, лучшим решением является настройка способа рисования содержимого ImageView таким образом, чтобы в любой момент времени он отображал часть растрового изображения, которое ему дано, и реальная анимация будет между двумя прямоугольниками растрового изображения. К сожалению, я не уверен, как это сделать.
Опять же, вопрос заключается не в получении растровых изображений или декодировании. Это о том, как заставить их работать с этим эффектом без сбоев или странного увеличения/уменьшения масштаба, которые показывают пустые места.