#android #animation
#Android #Анимация
Вопрос:
Я пытаюсь анимировать карточки по экрану.
Мой код выглядит следующим образом:
private void animate(ImageView animationSource, ImageView animationTarget, int animationDuration, int animationDelay) {
int[] animationSourcePosition = {0,0};
int[] animationTargetPosition = {0,0};
animationSource.getLocationInWindow(animationSourcePosition);
animationTarget.getLocationInWindow(animationTargetPosition);
TranslateAnimation cardDealingAnimation = new TranslateAnimation(
Animation.ABSOLUTE,animationSourcePosition[0],
Animation.ABSOLUTE,animationTargetPosition[0],
Animation.ABSOLUTE,animationSourcePosition[1],
Animation.ABSOLUTE,animationTargetPosition[1]);
cardDealingAnimation.setDuration(animationDuration);
cardDealingAnimation.setStartOffset(animationDelay);
animationTarget.startAnimation(cardDealingAnimation);
}
Что происходит, так это то, что он просто появляется в новом месте, не показывая промежуточные места.
Как ни странно, на одной из моих целей это иногда появляется.
Ответ №1:
Здесь я вижу две проблемы.
Одна из проблем заключается в том, что вы получаете положение ваших объектов в окне, где вы должны просто использовать положение объектов в их родительском контейнере. Это проще, быстрее и больше соответствует тому, что вы ищете — где находятся объекты в их макете. Если они не находятся в одном контейнере, то вам может потребоваться получить позицию в окне или на экране, а затем просто разобраться со значениями дельты (разница в их местоположениях, а не сами абсолютные местоположения).
Вы можете получить эти простые позиции контейнера из методов getLeft() и getTop() в режиме просмотра.
Вторая проблема заключается в том, что параметры TranslateAnimation не выполняют то, что вы думаете, что они делают. Числовые значения (второе, четвертое, шестое и восьмое значения) определяют начальное и конечное местоположения целевого объекта как смещения от его текущего местоположения. Вот почему в них есть слово ‘delta’ в объявлении метода. Таким образом, вы должны отправлять не абсолютные координаты позиций объектов, а, скорее, дельты, которые они должны иметь.
Предположим, вы вычислили xDelta и YDelta как разницу в x и y между исходной и целевой позициями. Если вы анимируете исходный код в целевую позицию, то для этих значений следует использовать что-то вроде 0, xDelta, 0, YDelta.
Обратите внимание, что TranslateAnimation () физически не перемещает объект — он просто рисует его в другом месте. Таким образом, как только анимация будет завершена, объект вернется в исходное местоположение. Возможно, вы захотите установить свойство fillAfter таким образом, чтобы оно сохраняло конечное местоположение на экране по завершении анимации.