Red de conocimiento del abogados - Respuesta jurídica de la empresa - La diferencia entre animación y animador.

La diferencia entre animación y animador.

1. Prólogo

El marco Animator es un marco de animación recientemente agregado en Android 4.0. En comparación con el marco de animación anterior, Animator puede realizar un control de animación cada vez más refinado. más simple y más eficiente que antes. El uso de Animator se puede ver en todas partes del código fuente 4.0.

2. Comparación entre Animation y Animator

Como se muestra a continuación, es una comparación de los diagramas de herencia de Animation y Animator.

C: Objeto C: Objeto

C: Animación C: Animador

C: AlphaAnimation C: AnimatorSet

C: AnimationSet C : ValueAnimator

C: DummyAnimation C: ObjectAnimator

C: Rotate3dAnimation C: TimeAnbimator

C: RotateAniamtion

C: ScaleAnimation

C: TranslateAnimation

El marco de animación define varias animaciones comunes, como transparencia, rotación, escala y desplazamiento, y controla una animación de Vista completa. El principio de implementación es que cada vez que se dibuja la Vista. , la función View La función drawChild en el ViewGroup donde se encuentra obtiene el valor de Transformación de la Animación de la Vista y luego llama a canvas.concat (transformToApply.getMatrix()) para completar el cuadro de animación mediante operaciones matriciales. , continúe llamando a la función invalidate () para iniciar el siguiente dibujo. Se utiliza para controlar la animación. El tiempo de intervalo entre fotogramas durante el proceso de animación es el tiempo consumido por la función de dibujo, lo que puede hacer que la animación consuma más recursos de CPU.

El método más utilizado en el marco de Animator es la combinación de AnimatorSet y ObjectAnimator. ObjectAnimator se utiliza para un control más refinado. Solo controla un valor de atributo de un objeto. Se combinan varios ObjectAnimators en AnimatorSet. una animación.

Además, ObjectAnimator se puede controlar automáticamente. Puede llamar a setFrameDelay (longframeDelay) para establecer el intervalo de tiempo entre cuadros de animación, ajustar la velocidad de cuadros, reducir el dibujo frecuente de la interfaz durante el proceso de animación y reducir el consumo de recursos de la CPU sin afectar el efecto de la animación. .

3. Introducción a las interfaces clave

1. Introducción a ObjectAnimator

El marco de Animator está perfectamente encapsulado y la interfaz proporcionada al mundo exterior es muy simple. Para crear un ObjectAnimator, solo necesita pasar La clase de fábrica estática que se muestra en la figura siguiente devuelve directamente un objeto ObjectAnimator. Los parámetros pasados ​​incluyen un objeto y el nombre del atributo del objeto, pero este atributo debe tener funciones get y set. La función set se llamará internamente a través del mecanismo de reflexión de Java para modificar el valor del atributo del objeto. También incluye el valor inicial y el valor final del atributo, y también puede llamar a setInterpolator para configurar la función de curva.

2. Introducción a AnimatorSet

AnimatorSet combina principalmente múltiples AnimatorSets y ObjectAnimators para formar una animación y puede controlar el orden de reproducción de la animación. También hay una clase auxiliar que se obtiene llamando. la función de juego.

3. Introducción a AnimatorUpdateListner

Al implementar AnimatorUpdateListner, puede obtener eventos cuando los valores de los atributos cambian e iniciar un evento de redibujado de pantalla en esta devolución de llamada.

4. Ejemplos de uso

Hay una instancia de BouncingBalls en ApiDemo en Android 4.0, que describe el uso del marco Animator. Cuando se hace clic en la pantalla, se dibuja una bola. cae desde la posición en la que se hizo clic. Vaya a la parte inferior de la pantalla. Cuando toque el fondo, la bola tendrá un efecto aplastante y luego rebotará hasta la posición en la que se hizo clic y luego desaparecerá.

El código es el siguiente:

ShapeHolder newBall =addBall(event.getX(), event.getY());

// Animación de rebote con aplastar y estirar

float startY = newBall.getY();

float endY = getHeight() - 50f

float h = (float)getHeight( );

float eventY = event.getY();

int duración = (int)(500 * ((h - eventY)/h));

ValueAnimator reboteAnim = ObjectAnimator.ofFloat(newBall, "y", startY, endY);

reboteAnim.setDuration(duración);

reboteAnim.setInterpolator(nuevo AccelerateInterpolator()) ;

p>

ValueAnimator squashAnim1 = ObjectAnimator.ofFloat(newBall, "x", newBall.getX(),

newBall.getX() - 25f

squashAnim1.setDuration (duración/4);

squashAnim1.setRepeatCount(1);

squashAnim1.setRepeatMode(ValueAnimator.REVERSE); > squashAnim1.setInterpolator(new DecelerateInterpolator());

ValueAnimator squashAnim2 = ObjectAnimator.ofFloat(newBall, "width", newBall.getWidth(),

newBall.getWidth() 50

squashAnim2.setDuration(duración/4);

squashAnim2.setRepeatCount(1);

squashAnim2.setRepeatMode(ValueAnimator.REVERSE); p>

squashAnim2.setInterpolator (nuevo DecelerateInterp

olator());

ValueAnimator stretchAnim1 = ObjectAnimator.ofFloat(newBall, "y", endY,

endY 25f

stretchAnim1.setDuration(duración); /4);

estiramientoAnim1.setRepeatCount(1);

estiramientoAnim1.setInterpolator(nuevo DecelerateInterpolator());

estiramientoAnim1.setRepeatMode(ValueAnimator.REVERSE) ;

ValueAnimator stretchAnim2 = ObjectAnimator.ofFloat(newBall, "altura",

newBall.getHeight(), newBall.getHeight() - 25);

estiramientoAnim2.setDuration(duración/4);

estiramientoAnim2.setRepeatCount(1);

estiramientoAnim2.setInterpolator(nuevo DecelerateInterpolator());

estiramientoAnim2.setRepeatMode (ValueAnimator.REVERSE);

ValueAnimator reboteBackAnim = ObjectAnimator.ofFloat(newBall, "y", endY,

startY

reboteBackAnim.setDuration);

reboteBackAnim.setInterpolator(newDecelerateInterpolator());

// Secuencia de las animaciones down/squashamp;up

AnimatorSet = new AnimatorSet() ;

rebote.play(bounceAnim).antes(squashAnim1);

rebote.play(squashAnim1).with(squashAnim2);

rebote.play( squashAnim1).with(stretchAnim1);

reboteador.pl

ay(squashAnim1).with(stretchAnim2);

Bouncer.play(bounceBackAnim).after(stretchAnim2);

// Animación que se desvanece: retira la pelota cuando termine la animación

p>

ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);

fadeAnim.setDuration(250); .addListener(new AnimatorListenerAdapter () {

@Override

public void onAnimationEnd(Animatoranimation) {

balls.remove(((ObjectAnimator)animation).getTarget ());

}

});

// Secuencia las dos animaciones para reproducirlas una tras otra

AnimatorSet animatorSet = new AnimatorSet();

animatorSet.play(bouncer).before(fadeAnim);

// Inicia la animación

animatorSet.start();