Android TranslationAnimation работает неправильно - PullRequest
1 голос
/ 12 мая 2011

Я пытаюсь анимировать карточки по экрану.

Мой код выглядит следующим образом:

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 Ответ

8 голосов
/ 13 мая 2011

Здесь я вижу две проблемы.

Одна проблема заключается в том, что вы получаете положение ваших объектов в окне, где вы должны просто использовать положение объектов в их родительском контейнере.Это проще, быстрее и больше того, что вы ищете - где объекты живут в своей компоновке.Если они не находятся в одном и том же контейнере, то вам может потребоваться получить позицию в окне или на экране, а затем просто работать с дельта-значениями (разница в их расположениях, а не сами абсолютные местоположения).

Вы можете получить эти простые позиции контейнера из методов getLeft () и getTop () в View.

Вторая проблема заключается в том, что параметры TranslateAnimation не выполняют то, что, по вашему мнению, они делают.Числовые значения (второе, четвертое, шестое и восьмое значения) указывают начальное и конечное местоположения целевого объекта как смещения от его текущего местоположения .Вот почему в объявлении метода есть слово «дельта».Таким образом, вам не следует отправлять абсолютные координаты позиций объекта, а, скорее, дельты, которые они должны иметь.

Предположим, что вы вычислили xDelta и yDelta как разность x и y междуисходные и целевые позиции.Если вы анимируете источник в целевую позицию, то вы должны использовать что-то вроде 0, xDelta, 0, yDelta для этих значений.

Обратите внимание, что TranslateAnimation () физически не перемещает объект - он просто рисуетэто в другом месте.Поэтому, как только анимация будет завершена, объект вернется в исходное положение.Возможно, вы захотите установить свойство fillAfter, чтобы сохранить его конечное местоположение на экране после завершения анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...