Android ViewPropertyAnimator no se escala al mismo tiempo
Estoy intentando utilizar el ViewPropertyAnimator para escalar una visión (un ProgressBar indeterminado) cada vez que un botón es presionado.
loadingCircle.animate().scaleY(1.5f).scaleX(1.5f).setDuration(100f);
Tengo un animatorListener que las escalas vuelven a la normal onAnimationEnd:
- Android View y ViewGroup
- Android: Estado compartido compartido de vista de niño de su vista principal en Jelly Bean
- Android: ¿Cómo pasar mejor los datos a una vista?
- Analógico de android: filterTouchesWhenObscured para el nivel de API inferior a 9
- Animación de una vista mientras que ListView no está funcionando
loadingCircle.animate().scaleY(1.0f).scaleX(1.0f).setDuration(100f);
Nada demasiado complicado. Sin embargo, no parece escalar xyy al mismo tiempo siempre.
Normalmente lo hace bien la primera vez, a veces la segunda vez. Cuando no funciona, sólo anima la última operación de la cadena. Si es scaleX, solo escalará X. Si lo cambio, solo escalará Y.
Documentación para scaleX y scaleY decir:
Las animaciones que ya se ejecuten en la propiedad se cancelarán
Sin embargo, pensé que ViewPropertyAnimator podía ser encadenado, y este comentario se aplica solamente para las nuevas animaciones (en una diversa línea de código). ¿Estoy haciendo algo mal, o he encontrado un error?
Estoy usando Android 4.2.2 en un GalaxyS4. Stock ROM, pero con raíces. Si eso hace una diferencia.
- Obtener ids de vista en un bucle for por programa?
- Vistas superpuestas en Android
- Disposición de superposición de Android encima de todas las ventanas que recibe toques
- La superficie de la cámara Android se cambió constantemente
- ¿Cómo ampliar la vista sin problemas en Android?
- SurfaceView en ScrollView en 4.1
- Cómo aplicar un filtro de color a una vista con todos los niños
- ¿Cómo puede saber cuándo se termina de cargar una actividad de Android?
Creo que este es un error. He trabajado alrededor de esto usando ObjectAnimator
lugar de ViewPropertyAnimator
para obtener el mismo resultado. Así, el suyo parecería algo como:
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();
Fuente: http://developer.android.com/guide/topics/graphics/prop-animation.html#view-prop-animator
Leyendo a través del código fuente el comportamiento que describe tiene perfecto sentido y es por diseño. Cuando se agrega una animación, se iniciará en el próximo runloop / cuando se puede. A veces usted será capaz de obtener las dos animaciones allí antes de que esto suceda, a veces no.
Si le dices que no inicie la animación de inmediato, entonces tendrás suficiente tiempo para agregar todas tus animaciones. Esto obviamente es un poco un hack.
Probablemente podría probar algo como esto:
loadingCircle.animate() .setStartDelay(1000) //prevent the animation from starting .scaleY(1.5f) .scaleX(1.5f) .setDuration(100f) .setStartDelay(0) .start();
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();
- Problema con Android Studio Gradle después de actualizar a la versión 0.6.0
- Interruptor multinivel Android