Как объяснить систему координат на 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 ответ:
Я считаю, что конструктор для 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 может иногда удивлять вас и вызывать нервное поведение. Но если вы делаете это так, конструкторы, принимающие Дельта-парамы, не должны снова сбивать с толку.