2014-09-24 3 views
8

Я пытаюсь использовать ViewPropertyAnimator для масштабирования вида (неопределенного ProgressBar) при каждом нажатии кнопки.Android ViewPropertyAnimator не масштабируется в одно и то же время

loadingCircle.animate().scaleY(1.5f).scaleX(1.5f).setDuration(100f); 

У меня есть animatorListener, масштабируемую обратно к нормальному onAnimationEnd:

loadingCircle.animate().scaleY(1.0f).scaleX(1.0f).setDuration(100f); 

Ничего слишком сложного. Однако, похоже, он не всегда масштабирует как x, так и y всегда.

Обычно он делает это в первый раз, иногда во второй раз. Когда он не работает, он только оживляет последнюю операцию в цепочке. Если это Scalex, то это будет только масштаб X. Если я поменять его вокруг, то это будет только масштаб Y.

Документация для Scalex и ScaleY говорят:

Анимации уже работает на имущество будет отменен

Однако, я думал, что ViewPropertyAnimator смог быть привязан, и этот комментарий применим только к новым анимациям (на другой строке кода). Я что-то делаю неправильно, или я нашел ошибку?

Я запускаю Android 4.2.2 на GalaxyS4. Фондовый ПЗУ, но коренится. Если это имеет значение.

+0

если все, что вы заметили, правильно, я думаю, да, у вас есть. – mmlooloo

ответ

6

Я считаю, что это действительно ошибка. Я работал над этим, используя ObjectAnimator вместо ViewPropertyAnimator, чтобы получить тот же результат. Таким образом, ваш будет выглядеть примерно так:

ObjectAnimator animX = ObjectAnimator.ofFloat(loadingCircle, "scaleX", 1.0f); 
ObjectAnimator animY = ObjectAnimator.ofFloat(loadingCircle, "scaleY", 1.0f); 
AnimatorSet animSetXY = new AnimatorSet(); 
animSetXY.playTogether(animX, animY); 
animSetXY.start(); 

Источник: http://developer.android.com/guide/topics/graphics/prop-animation.html#view-prop-animator

2

Чтение через исходный код поведение вы описываете имеет смысл и является дизайн. Когда вы добавляете анимацию, она запускается на следующей runloop/когда это возможно. Иногда вы сможете получить обе анимации там, прежде чем это произойдет, иногда вы этого не сделаете.

Если вы сообщите ему, чтобы не начать анимацию сразу, у вас будет достаточно времени, чтобы добавить все ваши анимации. Это, очевидно, немного взломан.

Вы могли бы попробовать что-то вроде этого: "? Я нашел ошибку"

loadingCircle.animate() 
    .setStartDelay(1000) //prevent the animation from starting 
    .scaleY(1.5f) 
    .scaleX(1.5f) 
    .setDuration(100f) 
    .setStartDelay(0) 
    .start(); 
0
AnimatorSet set = new AnimatorSet(); 
     set.setInterpolator(new AccelerateInterpolator()); 
     set.setDuration(100l); 
     view.setPivotX(halfWidth); 
     view.setPivotY(helfHeight); 
     set.play(ObjectAnimator.ofFloat(view, View.SCALE_X, 0f, 1f)) 
       .with(ObjectAnimator.ofFloat(hRippleAdd, View.SCALE_Y, 0f, 1f)); 
     set.start(); 
+0

его лучше объяснить немного о вашем коде;) –

Смежные вопросы