¿Cambiar varias propiedades con ObjectAnimator?
Tengo una animación bastante compleja que necesito codificar y estoy usando un montón de ObjectAnimators como el siguiente:
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(view, TRANSLATION_X, value).setDuration(BASE_DURATION * 2); ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(view, TRANSLATION_Y, value).setDuration(BASE_DURATION * 2);
¿Es posible agrupar las traducciones X e Y en el mismo ObjectAnimator en lugar de crear un montón de ellas y luego agregarlas todas en un AnimatorSet?
- Cómo crear el efecto de pulso ImageView con nueve animaciones androides de edad
- Animación de desplazamiento de la lista de Android
- Android: cambia el margen izquierdo con la animación
- Animación de la propiedad weightSum mediante ObjectAnimator
- Facebook lide slideout menu (No utiliza esa biblioteca)
¡Gracias!
- Cómo generar la animación de bucle con ViewPropertyAnimator?
- Android L ViewAnimationUtils no encontrado?
- Android: Girar animación volver a su estado real después de terminar la animación?
- Cómo implementar la pantalla Detalles de contacto como Lollipop
- Cómo crear una animación de "relleno" en Android
- ¿Cómo mover una vista en Android?
- Windowmanager con animación
- AnimationDrawable no funciona en la versión 2.3.6 android
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat(TRANSLATION_X, value); PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat(TRANSLATION_Y, value); ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY); animator.setDuration(BASE_DURATION * 2); animator.start();
http://developer.android.com/guide/topics/graphics/prop-animation.html#views Un ObjectAnimator
Creo que deberías usar un AnimationSet . Prácticamente hace lo que quieres y es la buena manera de hacerlo porque cuando pienso en PropertyValuesHolder no pienso en Keyframes .
Así que sí:
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(view, TRANSLATION_X, value); ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(view, TRANSLATION_Y, value); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(objectAnimator1, objectAnimator2); animatorSet.setDuration(BASE_DURATION * 2); animatorSet.start();
Puede agregar tantos ObjectAnimators como desee.
Si está animando una vista (como su ejemplo sugiere), podría usar un ViewPropertyAnimator:
view.animate().translationX(value_x).translationY(value_y).setDuration(duration).start();
Animación de la vista se podría hacer aún más fácil:
v.animate().x(valueX).y(valueY).setDuration(500).start();
(En este fragmento se ha utilizado ViewPropertyAnimator).
Un enfoque alternativo que he utilizado para agregar varias propiedades a la animación de un objeto es utilizar una combinación de código y XML para definir la animación. Esto se basa en esta documentación
Por ejemplo, en XML puedo configurar AnimatorSets y ObjectAnimators para un solo objeto con valores estáticos, y definir una secuencia secuencial de cambios (res / animator / moveout.xml)
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially"> <set> <objectAnimator android:propertyName="scaleX" android:duration="2000" android:valueTo="0.8" android:interpolator="@android:anim/decelerate_interpolator"/> <objectAnimator android:propertyName="scaleY" android:duration="2000" android:valueTo="0.8" android:interpolator="@android:anim/decelerate_interpolator"/> <objectAnimator android:propertyName="alpha" android:duration="2000" android:valueTo="0" android:interpolator="@android:anim/decelerate_interpolator"/> </set> <set> <objectAnimator android:propertyName="scaleX" android:duration="2000" android:valueTo="1.2" android:interpolator="@android:anim/accelerate_interpolator"/> <objectAnimator android:propertyName="scaleY" android:duration="2000" android:valueTo="1.2" android:interpolator="@android:anim/accelerate_interpolator"/> <objectAnimator android:propertyName="alpha" android:duration="2000" android:valueTo="1" android:interpolator="@android:anim/accelerate_interpolator"/> </set> </set>
Entonces puedo cargar estos AnimatorSets / ObjectAnimators en tiempo de ejecución y modificar sus valores con valores generados dinámicamente:
AnimatorSet firstSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.moveout); AnimatorSet secondSet = firstSet.clone(); firstSet.setTarget(button); secondSet.setTarget(anotherButton); // Choreograph the animations // Change the duration of all child elements in the set firstSet.setDuration(1000); secondSet.setDuration(200); // Set start delay so second set plays after the first set secondSet.setStartDelay(2000); AnimatorSet anim = new AnimatorSet(); anim.playTogether(firstSet,secondSet); anim.start();