2011-02-12 15 views
11

Quiero tener una animación con varios pasos que hacen movimientos (traducciones) y rotaciones como "recto, gire a la izquierda, recto, ..." de un automóvil.¿Ejemplo completo de cómo programar RotateAnimations?

Puedo hacer esto en un AnimationSet, pero no puedo rotar alrededor del centro de la imagen de mi coche con la configuración "RELATIVE_TO_SELF". Sé sobre

Animation a = new RotateAnimation(0,90,Animation.RELATIVE_TO_SELF,0.5f,...) 

para este propósito. Aún así, la rotación ocurre alrededor de la esquina superior izquierda de la pantalla (¿o lienzo?).

Actualmente estoy resolviendo esto haciendo un seguimiento manual de la posición después de cada paso de animación, pero esto no es óptimo.

Sospecho que mi diseño de la configuración inicial es falso:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:orientation="vertical" 
> 
    <FrameLayout 
      android:layout_height="wrap_content" 
      android:layout_width="fill_parent"> 

     <!-- view that draws some background --> 
     <de.bsd.turtlecar.SampleView android:id="@+id/graph_view" 
       android:layout_height="350px" 
       android:layout_width="fill_parent" 
       android:visibility="invisible" 
       /> 

     <!-- the car --> 
     <ImageView android:id="@+id/car_view" 
        android:src="@drawable/turtle_car" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:visibility="invisible"/> 


    </FrameLayout> 

    <Button ... onClick="run" ... /> 
</LinearLayout> 

Esto muestra el coche en la esquina superior izquierda (debe aparecer en un lugar diferente -, básicamente, en la animación comienza más tarde y debería. muévete más tarde).

En mi código que se activa a través del botón de ejecución que hago:

ImageView carView = (ImageView) findViewById(R.id.car_view); 
    print(carView); 
    AnimationSet animationSet = new AnimationSet(true); 

    TranslateAnimation a = new TranslateAnimation(
      Animation.ABSOLUTE,200, Animation.ABSOLUTE,200, 
      Animation.ABSOLUTE,200, Animation.ABSOLUTE,200); 
    a.setDuration(1000); 
    animationSet.addAnimation(a); 

    RotateAnimation r = new RotateAnimation(0f, -90f,200,200); // HERE 
    r.setStartOffset(1000); 
    r.setDuration(1000); 
    animationSet.addAnimation(r); 
    ... 

Por lo tanto en el punto de aquí, la rotación funciona, pero tengo que seguir la pista. si giro RELATIVE_TO_SELF, la rotación ocurre alrededor de (0,0) de la pantalla.

Pregunta adicional: ¿qué puedo hacer para mantener el automóvil en la pantalla una vez que la animación ha terminado?

¿O estoy completamente en la senda equivocada?

Respuesta

17

Intente agregar establecerFillAfter (verdadero) a sus animaciones. Que sin duda mantener el coche en su lugar definitivo y que puede resolver sus problemas de punto de rotación demasiado

TranslateAnimation a = new TranslateAnimation(
     Animation.ABSOLUTE,200, Animation.ABSOLUTE,200, 
     Animation.ABSOLUTE,200, Animation.ABSOLUTE,200); 
a.setDuration(1000); 
a.setFillAfter(true); //HERE 
animationSet.addAnimation(a); 

RotateAnimation r = new RotateAnimation(0f, -90f,200,200); // HERE 
r.setStartOffset(1000); 
r.setDuration(1000); 
r.setFillAfter(true); //HERE 
animationSet.addAnimation(r); 
... 
+13

Nota: paso final aquí es llamar 'carView.startAnimation (animationSet);' – Nilzor

Cuestiones relacionadas