Как объяснить систему координат на Android анимации?


Как мы знаем, система координат android начинается с верхнего левого угла экрана android. Ось x - это рост вниз, а ось y-это правильный рост.Но я обнаружил, что это не подходит для анимации.

Например, я инициализировал TranslateAnimation, используя построенную функцию:

TranslateAnimation ta = new TranslateAnimation(0.0f, 200, 0.0f, 200);  

Изменилась ли система координат ? Я обнаружил, что он не начинается с верхнего левого угла.

Затем я инициализировал другую translateAnimation для перемещения вверх и вправо направление :

TranslateAnimation ta = new TranslateAnimation(0.0f, 200, 0.0f, -200); 
ta.setReaptMode(Animation.REVERSE);

Будет найдено то же самое поведение. Меня это смущает.

1 2

1 ответ:

Я считаю, что конструктор для TranslateAnimation использует дельты. Смотрите это . Или посмотрите на конструктор sig. : (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta). Так что если ты хочешь свой аним. чтобы прыгнуть вверх сначала, вы можете использовать отрицательный третий ctor param.

Точнее:

Анимация не может начаться до тех пор, пока макет не будетизмерен . Обычно не нужно беспокоиться о том, как это работает, кроме того, алгоритм в основном очень хорош, и вы можете взять под контроль его стратегии установив параметры компоновки . Короче говоря, к моменту запуска анимации мы знаем, где Вы хотите, чтобы вид был на экране, потому что вы задаете параметры макета.

Translate animation затем принимает дельты изэтой позиции . Таким образом, ваша текущая анимация не должна начинаться с верхнего левого края, а скорее там, где эти параметры макета были оценены onMeasure.

Некоторые сказали бы-как досадно. Это будет сложно, даже если ты просто захочешь. сделайте несколько простых анимаций типа вверх-вниз... Ну, вот рекомендуемая стратегия развития; это snould сделать Android animation development breeeze. Установите Ан animationListener на каждой анимации. В onAnimationEnd, возможно, параметизированным способом, сбросьте параметры макета на вид, который вы анимируете, туда, где выожидаете . Таким образом, вы не получите никаких неожиданных "прыжков" при повторном применении анимации. Вам может понадобиться invalidate в некоторых обстоятельствах или clearAnimation. Причина в том, что это работает так, что проход меры будет вызван, чтобы прийти снова, и вы будете иметь новое смещение для вашего TranslateAnimation. Наконец, вы можете сделать все это, сбросив отправленные в очередь сообщений представления с помощью post(Runnable runnable) в прослушивателе, так что вы выключили последний проход рисования анимации.

Я тоже обнаружил, что анимация android может иногда удивлять вас и вызывать нервное поведение. Но если вы делаете это так, конструкторы, принимающие Дельта-парамы, не должны снова сбивать с толку.