¿Qué tipos de animaciones hay en Android?
1. Animación de cuadro: (animación cuadro por cuadro)
Esto es fácil de entender. Reproduzca la imagen cuadro por cuadro, utilizando el principio del residuo visual humano para darnos la sensación de animación. Su principio es el mismo que el de las imágenes y películas GIF.
1. Definir la animación cuadro por cuadro es relativamente simple, siempre que utilice el subelemento para definir todos los cuadros de reproducción.
(1)Android: ¿One Shot está configurado para jugarse solo una vez?
(2) android:drawable establece la imagen para cada cuadro.
(3) android:duration establece el intervalo de cambio entre imágenes.
2. Es habitual establecer AnimationDrawable como fondo de ImageView.
Android:background = @ anim/frame _ anim
Luego podemos usar código java para obtener el objeto AnimationDrawable.
AnimationDrawable anim =(AnimationDrawable)imageview.get background();
(Cabe señalar que AnimationDrawable no se reproduce de forma predeterminada. Llame a su método start() para iniciar y detener reproducción)
3. Los archivos de animación anteriores están configurados mediante archivos xml. Si lo desea, también puede usar código Java para crear un objeto AnimationDrawable, luego agregar un marco a la animación mediante el método Agregar marco (marco dibujable, duración de duración) y luego iniciar (). . .
Animación interpolada: (animación interpolada)
La animación interpolada significa que solo necesitamos especificar los "fotogramas clave" al principio y al final, y el sistema calcula otros fotogramas de cambio. sin tener que Definir cuadro por cuadro.
1. Android usa animación para representar animaciones abstractas, incluidas cuatro subcategorías: AlphaAnimation (animación transparente), ScaleAnimation (animación de escala), TranslateAnimation (animación de desplazamiento) y RotateAnimation (animación transparente). Android le permite usar Java para crear objetos de clase de animación, pero los archivos de recursos de animación generalmente se usan para definir animaciones para separar la interfaz y la lógica.
& ltset Android:interpolator = " @ Android:anim/linear _ interpolator " xmlns:Android = "/apk/RES/Android " & gt; -Transformación que define la transparencia->
<! -Definir transformación de rotación->
<rotation Android:duration = " 3000/" Android:from grados = " 0 " Android:pivotx = " 50% " Android:pivoty = " 50% " Android:togrados = " 1800 ">
</rotate></alpha></set>
(Un conjunto puede definir simultáneamente varias animaciones y ejecutarlas juntas).
2. Android: interpolator = @ Android:anim/linear _ interpolator controla cuántos fotogramas se deben agregar durante el proceso de animación. En pocas palabras, controla la velocidad de la animación.
Hay varios tipos de implementación de interpoladores: interpoladores lineales, interpoladores acelerados, interpoladores acelerados, interpoladores circulares e interpoladores desacelerados. Consulte la demostración oficial de API para conocer un uso específico.
3. Después de definir el archivo anim, podemos cargarlo a través de la clase de herramienta AnimationUtils y devolver una animación después de una carga exitosa. Luego puede iniciar la animación a través de startAnimation(anim) de la vista.
animación anim = utilidades de animación. cargar animación(this, r . anim . anim
//Establece el estado final después de la animación.
anim.setfillafter(true);
//Establecer el efecto de interpolación
anim.setInterpolator(interpolator);
// Vista de animación
Ver. startAnimation (animación);
3. Animación de atributos: (animación de atributos)
La animación de atributos introducida en Android 3.0 puede cambiar directamente los atributos de nuestros objetos. La animación de interpolación mencionada anteriormente solo cambia el efecto de pintura de la vista, pero no cambia las propiedades reales de la vista. Suponga que utiliza una animación de interpolación para mover un botón de izquierda a derecha. No importa cómo haga clic en el botón movido, no responderá. Cuando hace clic en la posición del botón antes de moverlo, responde porque la propiedad de posición del botón no ha cambiado. La animación de propiedades puede cambiar directamente los valores de propiedad del objeto de vista, lo que nos permite realizar menos trabajo de procesamiento y mejorar la eficiencia y la legibilidad del código.
(1) ValueAnimator: contiene todas las funciones principales de la animación de atributos, como el tiempo de animación, los valores de atributos de inicio y fin, los métodos de cálculo de los valores de atributos de tiempo correspondientes, etc. Hay dos pasos para aplicar ValueAnimator.
1 Calcular valores de atributos.
Realizar las operaciones correspondientes según el valor del atributo, como cambiar las propiedades del objeto.
Nuestra tarea principal es el segundo paso. Necesitamos implementar la interfaz ValueAnimator.onUpdateListener. Esta interfaz tiene solo una función, onAnimationUpdate(). Las cosas que cambian las propiedades del objeto de vista se realizan en esta interfaz.
animación . addupdatelistener(new AnimatorUpdateListener(){
@override
vacío público en la actualización de la animación (animación del animador de valor){
//Haz tu trabajo
}
});
(2)ObjectAnimator: heredado de ValueAnimator, necesitas especificar un objeto y un atributo del objeto, y se establece automáticamente en el atributo correspondiente del objeto cuando se completa el cálculo del valor del atributo, es decir, se completan los dos pasos de la animación del atributo. En aplicaciones prácticas, ObjectAnimator se usa generalmente para cambiar una propiedad de un objeto, pero existen ciertas restricciones sobre el uso de ObjectAnimator. Si desea utilizar ObjectAnimator, se deben cumplir las siguientes condiciones:
1. El objeto debe tener una función de establecimiento: set (nomenclatura CamelCase).
2 Tome el siguiente ejemplo. Para un método de taller como ofFloat, el primer parámetro es el nombre del objeto, el segundo parámetro es el nombre del atributo y el último parámetro es el parámetro variable. Si solo se establece un valor para el parámetro valores..., se supone que es el valor objetivo y los valores de propiedad varían desde el valor actual hasta el valor objetivo. Para obtener el valor actual, el objeto debe tener un método getter para la propiedad correspondiente: get.
3 Si hay un método getter, su tipo de valor de retorno debe ser coherente con el tipo de parámetro del método setter correspondiente.
ObjectAnimator OA = ObjectAnimator . off float(TV, alpha, 0f, 1f);
OA . );
Si no se cumplen las condiciones anteriores, solo puede utilizar ValueAnimator para crear animaciones.
(3) Animador. AnimatorListener: puede configurar el monitoreo de animación para Animator. Debe reescribir los siguientes cuatro métodos.
onAnimationStart()
onAnimationEnd()
onAnimationRepeat()
onAnimationCancel()
Aquí también AnimatorListenerAdapter se puede implementar. Su ventaja es que solo podemos definir los eventos que queremos escuchar en lugar de implementar cada función y solo definir un cuerpo de función vacío. Como se muestra a continuación:
anim . add listener(new AnimatorListenerAdapter(){
Public void on AnimationEnd(Animator Animation) {
//Haz tu trabajo
}
});
(4)AnimationSet: se pueden combinar varias animaciones para que funcionen juntas.
conjunto de animadores rebote = nuevo conjunto de animadores();
bouncer.play(anim1). antes(anim 2);
bouncer.play(anim 2). Utilice(anim 3);
bouncer.play(anim 2). Con (animación 4)
bouncer.play (animación 5). (amin2);
animator set . start();
El código anterior significa: reproducir la animación 1 primero; reproducir la animación 2, reproducir la animación 4 al mismo tiempo; último anime 5.
(5) Interpolador de tiempo: similar al interpolador en interpolación. Existen los siguientes tipos de aceleradores
La aceleración comienza lentamente.
El interpolador de desaceleración desacelera, arranca rápidamente y luego desacelera.
El acelerador acelera primero, luego desacelera, arranca lentamente, se detiene lentamente y acelera a la mitad.
AnticipateInterpolator es todo lo contrario: primero cambia una sección en la dirección opuesta y luego acelera la reproducción.
El interpolador Anticipateovershott aumenta el rebote en la dirección opuesta. Primero cambia en la dirección opuesta y luego acelera la reproducción. Superará el valor objetivo y luego se moverá lentamente hacia el valor objetivo.
BounceInterpolator salta cuando alcanza el valor objetivo. Por ejemplo, el valor objetivo es 100 y los valores posteriores pueden ser 85, 77, 70, 80, 90 y 100.
Bucle CycleIinterpolator, después de que la animación se repite un cierto número de veces, el valor se convierte en una función sinusoidal: Math. sin (2 * m período * matemáticas. Pi * entrada).
Interpolador lineal lineal, cambio uniforme lineal
OvershotInterpolator rebota, finalmente excede el valor objetivo y luego cambia lentamente al valor objetivo.
TimeInterpolator es una interfaz que permite personalizar interpoladores. Todo lo anterior implementa esta interfaz.
(6) Fotogramas clave: Nos permite definir fotogramas clave distintos al inicio y al final. El fotograma clave es una clase abstracta. El fotograma clave apropiado debe obtenerse mediante Ofint (), Offload () y OfObject (), y luego el objeto PropertyValueHolder se puede obtener a través de PropertyValueHolder.
Fotograma clave, como sigue:
Fotograma clave kf0 = Keyframe.ofInt(0, 400);
fotograma clave KF 1 = fotograma clave de int(0,25 f, 200);
fotograma clave kf2 = fotograma clave ofint(0.5f, 400);
fotograma clave kf4 = ofint(0.75 f, 100); Fotograma clave kf3 = Keyframe.ofInt(1f, 500);
PropertyValuesHolder pvhRotation = PropertyValuesHolder del fotograma clave (ancho, kf0, kf1, kf2, kf4, kf3);
Rotación de ObjectAnimator. anim = ObjectAnimator . ofpropertyvaluesholder(BTN, pvhRotation);
El código anterior significa: establezca el valor de la propiedad de ancho del objeto btn en: Ancho inicial = 400, Ancho inicial de la animación = 200 1/4, Ancho = 400 1/2 al comienzo de la animación, Ancho = 100 3/4 al comienzo de la animación y Ancho = 500 al final de la animación.
(7)viewpropertyimator: se recomienda encarecidamente cambiar varias propiedades de una vista al mismo tiempo. Esta clase optimiza las animaciones de múltiples propiedades y fusionará algunos invalid() para reducir la actualización de la vista. Y es muy sencillo de usar, pero requiere API nivel 12, que es Android 3.1 o superior. El movimiento horizontal y vertical solo requiere una línea de código.
myView.animate(). traducciónX(50f). Traducibilidad (100 f);
(8) Algunas propiedades que a menudo deben cambiarse:
Traducción x, traducción y: el desplazamiento de la vista desde la posición original.
Rotación, rotaciónX, rotaciónY: rotación, la rotación se usa para el ángulo de rotación 2D y las dos últimas se usan para 3D.
ScaleX, scaleY: relación de escala
x, y: las coordenadas finales de la vista son la posición superior izquierda de la vista más la traducciónX y la traducción y.
Alfa: transparencia
Cuarto, finalmente resuma las ventajas y desventajas de estas tres animaciones:
(1) La animación de cuadro se utiliza principalmente para reproducir cuadro por cuadro. imágenes, similares a las imágenes GIF. Su ventaja es que es sencillo y cómodo de usar, pero su desventaja es que cada cuadro debe prepararse con antelación.
(2) La animación de interpolación solo necesita definir los fotogramas clave al principio y al final, y el sistema complementará los fotogramas intermedios modificados. La ventaja es que no es necesario preparar cada cuadro. La desventaja es que solo cambia el dibujo del objeto y no cambia las propiedades de la vista en sí. Entonces, si cambia la posición del botón, aún deberá hacer clic en la posición original del botón para que sea efectivo.
(3) La animación de atributos es una animación lanzada después de 3.0. Su ventaja es que es fácil de usar, reduce la complejidad de la implementación, cambia directamente las propiedades del objeto y es adecuado para casi cualquier objeto, no solo para clases de vista. Su desventaja es que requiere soporte API superior a 3.0, ¡lo cual es bastante restrictivo! Sin embargo, actualmente existen bibliotecas de código abierto en el extranjero que pueden brindar soporte para versiones inferiores.