2010-11-27 13 views
23

He escrito un View personalizado. Ahora quiero hacer una pequeña animación personalizada cuando el usuario la toque.Animación personalizada en Android

Cuando digo costumbre, quiero decir que, básicamente, quiero representar cada fotograma a mí mismo, y no uso una animación "predefinido", como se describe here.

¿Cuál es la forma correcta de implementar esto?

+0

[Personalizar animación en Android] (http://www.singhajit.com/android-custom-animations/) –

+0

@AjitSingh, que en el artículo se describen las animaciones estándar (rotación, traslación, etc.). Lo que estoy preguntando aquí es animaciones personalizadas. – aioobe

Respuesta

22

manera más flexible (y bastante fácil) para crear animaciones personalizadas es extender Animation clase.

En general:

  1. duración establecida de la animación usando setDuration() método.
  2. Opcionalmente establece el interpolador para su animación usando setInterpolator() (por exapmle puede utilizar LinearInterpolator o AccelerateInterpolator etc.)
  3. Anulación applyTransformation método. Aquí nos interesa la variable interpolatedTime que cambia entre 0.0 y 1.0 y representa el progreso de tu animación.

Aquí es un ejemplo (estoy usando esta clase de cambiar ofsset de mi BitmapBitmap mismo se dibuja en draw método.):

public class SlideAnimation extends Animation { 

    private static final float SPEED = 0.5f; 

    private float mStart; 
    private float mEnd; 

    public SlideAnimation(float fromX, float toX) { 
     mStart = fromX; 
     mEnd = toX; 

     setInterpolator(new LinearInterpolator()); 

     float duration = Math.abs(mEnd - mStart)/SPEED; 
     setDuration((long) duration); 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     super.applyTransformation(interpolatedTime, t); 

     float offset = (mEnd - mStart) * interpolatedTime + mStart; 
     mOffset = (int) offset; 
     postInvalidate(); 
    } 

} 

También puede modificar mediante el uso de ViewTransformation#getMatrix().

ACTUALIZACIÓN

En caso si usted está utilizando el framework de Android animador (o compatibilidad aplicación - NineOldAndroids) puede declarar setter y getter para su propiedad personalizada View y animar directamente. Aquí hay otro ejemplo:

public class MyView extends View { 

    private int propertyName = 50; 

    /* your code */ 

    public int getPropertyName() { 
     return propertyName; 
    } 

    public void setPropertyName(int propertyName) { 
     this.propertyName = propertyName; 
    } 

    /* 
    There is no need to declare method for your animation, you 
    can, of course, freely do it outside of this class. I'm including code 
    here just for simplicity of answer. 
    */ 
    public void animateProperty() { 
     ObjectAnimator.ofInt(this, "propertyName", 123).start(); 
    } 

} 
+1

Una de estas respuestas con "¡Ahaaaa!" efecto. ¡Bonito! – Terry

-1

Además de definir animaciones interpoladas en XML, también puede definir animaciones cuadro por cuadro (almacenadas en res/dibujables).

<animation-list 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="true" 
> 
    <item android:drawable="@drawable/frame1" android:duration="300" /> 
    <item android:drawable="@drawable/frame2" android:duration="300" /> 
    <item android:drawable="@drawable/frame3" android:duration="300" /> 
</animation-list> 

Establezca la animación como el fondo Ver a través de setBackgroundResource.

Si está buscando algo más complicado, eche un vistazo a la clase Canvas. Vea la breve introducción sobre cómo draw with Canvas.

+1

Quiere representar cada fotograma dentro del programa. – dacwe

+0

Hmmm ... la animación depende de dónde se presionó el componente ... – aioobe

2
Animation animation = new AnimationDrawable(); 
animation.addFrame(getResources().getDrawable(R.drawable.exp1), 50); 
animation.addFrame(getResources().getDrawable(R.drawable.exp2), 50); 
animation.addFrame(getResources().getDrawable(R.drawable.exp3), 50); 
animation.addFrame(getResources().getDrawable(R.drawable.exp4), 50); 
animation.addFrame(getResources().getDrawable(R.drawable.exp5), 50); 
animation.addFrame(getResources().getDrawable(R.drawable.exp6), 50); 

Este es el código que utilizo para producir una animación personalizada, fotograma a fotograma en mi onCreate().

Después de eso tengo que comenzar la animación, pero debo hacerlo dentro del hilo de la interfaz de usuario. Por lo tanto, uso Runnable.

class Starter implements Runnable { 
    public void run() { 
     animation.stop(); 
     animation.start(); 
    } 
} 

Me principio que Ejecutable desde un onClick() utilizando el método de .post() de ImageView:

((ImageView) findViewById(R.id.ImageToAnimateOnClicking)).post(new Starter()); 
+0

Se ve bien. ¿Es factible renderizar esos programas de forma programable? (La animación depende de dónde haga clic el usuario ...) – aioobe

+0

La animación 'AnimationDrawable' puede ser setas del fondo Ver a través de setBackgroundResource. También puede encontrar formas fáciles de posicionarlo completamente con superposiciones. ¡probablemente depende de dónde haga clic el usuario! (en un botón? una vista de superficie? ¿una imagen? ¿una vista de lista?) –

1

Asumo se crea cada fotograma como un mapa de bits y, a continuación, pasar a la animación directamente, en lugar de obtener Drawable del recurso.

Bitmap bm = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_888); 
Canvas c = new Canvas(bm); 
.... Draw to bitmap 
animation.addFrame(bm,50) 
.... repeat for all frames you wish to add. 
+0

Es una lástima que no puedo decir con anticipación la cantidad de FPS que puede manejar el dispositivo. Si solo puede manejar como 5 FPS, entonces no debería gastar tantos recursos en renderizar una animación de 20 FPS ... Si hay una buena forma de programar "repetidamente" un repintado, y renderizar el cuadro a pedido, no lo haría. No tengo este problema – aioobe

+1

Bueno, si usó Opengl, todos deberían poder manejar 30fps sin problema. Y deberías estarlo si estás haciendo algo desafiante en forma gráfica. Hay una GRAN diferencia de rendimiento entre Canvas y GL. – HaMMeReD

0

Hay cuatro tipos de animación que puede agregar a su vista personalizada.

  1. alpha - Animación de transparencia de elemento
  2. traducen - posición del elemento animado
  3. escala - animar tamaño de elemento
  4. gira - animar la rotación del elemento

Aquí es una blog post que explica cada uno de ellos en detalle.

Una vez que haya terminado con la creación de una animación, simplemente use el siguiente código para agregar esa animación personalizada a la vista.

findById(R.id.element).startAnimation(AnimationUtils.loadAnimation(this, R.anim.custom_animation)); 
+0

Creo que te perdiste el segundo párrafo en mi pregunta. – aioobe

Cuestiones relacionadas