Анимация ViewGroup не работает

Я пытаюсь сделать легкую анимацию перевода в Android. Не работает следующее:

public class MyView extends ViewGroup {
    ...
    TranslateAnimation animation = new TranslateAnimation(0, 0, 0, -500);
    animation.setDuration(300);
    startAnimation(animation);
    ...
}

Однако это работает:

public class MyView extends ViewGroup {
    ...
    animate().setDuration(300).translationYBy(-500);
    ...
}

Мне нужна верхняя версия, потому что я добавляю больше представлений, которые нужно анимировать одновременно, и я хотел бы использовать TranslateAnimation внутри AnimationSet.


person MrGrinst    schedule 06.06.2015    source источник


Ответы (2)


Это не ответ на фактический вопрос, а скорее предложение о том, как использовать ViewPropertyAnimator одновременно с разными представлениями и значениями. Напишите свой собственный метод и передайте значения, которые вам нужны в качестве параметров, например (минимальная реализация):

private void animateView(View view, float transX, float transY, int duration) {

     view.animate().
         .translationXBy(transX)
         .translationYBy(transY)
         .duration(duration);
}

Добавьте больше параметров, если хотите. Например, значения интерполятора, масштаба, поворота или альфа-канала. Затем используйте цикл или напишите другой метод для одновременной анимации ваших представлений. Чтобы убедиться, что они анимируются одновременно, вы также можете добавить небольшую задержку ms startDelay к параметрам, чтобы убедиться, что все анимации готовы к загрузке перед запуском. Надеюсь, это поможет.

person A Honey Bustard    schedule 06.06.2015

Что ж, после некоторого исследования обоих методов анимации я пришел к следующему:

List<Animator> animators = new ArrayList<>();
for (int i = 0; i < view.getChildCount(); i++) {
    View child = view.getChildAt(i);
    ObjectAnimator va = ObjectAnimator.ofFloat(child, View.TRANSLATION_Y, child.getY() - 500);
    va.setDuration(300);
    animators.add(va);
}

Некоторое объяснение:

  1. TranslateAnimation являются частью старой библиотеки анимации, включенной в Android. На самом деле они не изменяют значения базовых свойств объекта по мере его анимации. Я заметил, что если я выполнял другие действия на экране (например, прокручивал ListView) во время выполнения анимации, вспышки анимации были видны.
  2. Что касается Honeycomb (Android 3.0), существует более новый способ анимации вещей, который изменяет сами значения базовых свойств по мере анимации. Он называется ObjectAnimator. Затем в версии 3.1 они представили еще один класс, чтобы сделать ObjectAnimator еще проще: ViewPropertyAnimator. Второй метод, который я использовал, на самом деле является ярлыком для использования ViewPropertyAnimator.
  3. Как я уже сказал в вопросе, мне нужно было любое решение, которое я нашел, чтобы анимировать несколько вещей одновременно. К сожалению, ViewPropertyAnimator не может делать несколько анимаций одновременно. В итоге я использовал ObjectAnimator
  4. Наконец, поскольку ObjectAnimator не поддерживает перевод на определенное значение, мне пришлось вычислять окончательные позиции Y представлений, используя их текущие значения Y.

источник: http://android-developers.blogspot.com/2011/05/introduction-viewpropertyanimator.html

person MrGrinst    schedule 06.06.2015
comment
Что вы имеете в виду, говоря, что ViewPropertyAnimator не может выполнять несколько анимаций одновременно? - person A Honey Bustard; 06.06.2015
comment
Возможно, этот ответ и ссылки на видео помогут вам лучше понять различные API-интерфейсы анимации: против перевода анимации"> stackoverflow.com/questions/29175429/ - person A Honey Bustard; 06.06.2015
comment
Мне не удалось найти какие-либо методы в ViewPropertyAnimator, которые позволили бы мне предоставить список представлений и различных значений и анимировать все сразу. - person MrGrinst; 06.06.2015