Анимация перевода для Android работает некорректно

#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 таким образом, чтобы оно сохраняло конечное местоположение на экране по завершении анимации.