2011-02-11 14 views
7

Estoy tratando de usar el marco de animación de Android para mover mi ImageView en un patrón de diamante. Aquí está mi animation.xml:Problemas de XML de animación de Android

<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="true"> 
<translate 
    android:fromXDelta="40%p" android:toXDelta="90%p" 
    android:fromYDelta="10%p" android:toYDelta="40%p" 
    android:duration="500" android:startOffset="0"/> 
<translate 
    android:fromXDelta="90%p" android:toXDelta="40%p" 
    android:fromYDelta="40%p" android:toYDelta="90%p" 
    android:duration="500" android:startOffset="500"/> 
<translate 
    android:fromXDelta="40%p" android:toXDelta="10%p" 
    android:fromYDelta="90%p" android:toYDelta="40%p" 
    android:duration="500" android:startOffset="1000"/> 
<translate 
    android:fromXDelta="10%p" android:toXDelta="40%p" 
    android:fromYDelta="40%p" android:toYDelta="10%p" 
    android:duration="500" android:startOffset="1500"/> 
</set> 

Mi diseño:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> 
    <ImageView 
     android:id="@+id/img" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/icon"/> 
</FrameLayout> 

Y mi onStart:

protected void onStart() { 
    super.onStart(); 

    ImageView img = (ImageView)findViewById(R.id.img); 
    Animation a = AnimationUtils.loadAnimation(this, R.anim.diamond); 
    img.startAnimation(a); 
} 

Cuando comienzo mi solicitud único que veo es una pantalla en blanco durante 2 segundos y luego mi imagen aparece en la esquina superior izquierda de la pantalla. Si elimino todas menos una de las animaciones de traducción, veré que la imagen se mueve en una línea diagonal.

Preferiría usar XML para definir la animación y no Java.

¿Alguien tiene alguna idea de cómo puedo ver toda la animación?

-Dan

+0

Parece que tiene algo que ver con el uso de "% p". Si cambio "% p" a "%", toda la animación funciona, pero ahora está limitada a una parte mucho más pequeña de la pantalla. De acuerdo con el documento "%" está en relación con el objeto y "% p" está en relación con el objeto primario del objeto, que es realmente lo que quiero. Lo que explica por qué solo está haciendo la animación en una caja pequeña. – Dan

+0

Para aclarar más, me gustaría usar XML para definir mi animación en relación con el elemento primario de ImageView que estoy animando. No aceptaré ninguna respuesta que diga que el marco está roto, ni aceptaré una respuesta que requiera que la animación se defina en Java. – Dan

Respuesta

15

Los atributos de animación son relativos a donde están cuando empiezan. Esta es probablemente mucho más cerca de lo que quiere:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="true"> 
<translate 
    android:fromXDelta="40%p" android:toXDelta="90%p" 
    android:fromYDelta="10%p" android:toYDelta="40%p" 
    android:duration="500" android:startOffset="0"/> 
<translate 
    android:fromXDelta="0%p" android:toXDelta="-50%p" 
    android:fromYDelta="0%p" android:toYDelta="50%p" 
    android:duration="500" android:startOffset="500"/> 
<translate 
    android:fromXDelta="0%p" android:toXDelta="-30%p" 
    android:fromYDelta="0%p" android:toYDelta="-50%p" 
    android:duration="500" android:startOffset="1000"/> 
<translate 
    android:fromXDelta="0%p" android:toXDelta="30%p" 
    android:fromYDelta="0%p" android:toYDelta="-30%p" 
    android:duration="500" android:startOffset="1500"/> 
</set> 
+0

¡Excelente! ¡Funcionó! ¡Gracias por su rápida respuesta! – Dan

+0

Hola, Reuben Scratton, quiero pausar esta animación en el botón clic y reanudar al hacer clic nuevamente. ¿Es posible? – Deepak

+0

Literalmente pasé todo el día tratando de resolver esto. Estaba a punto de darme por vencido. Gracias por la solución. – DroidT

1

Prueba esto:

Animation anim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.diamond); 
findViewById(R.id.img).setAnimation(anim); 
anim.start(); 

También debe probablemente cambiar las animaciones para cargar una tras otra. Creo que el conjunto que has creado intentará reproducir todas las animaciones a la vez, y eso no funcionará muy bien.

Utilice un animationListener así:

anim.setAnimationListener(new Animation.AnimationListener() { 

     public void onAnimationStart(Animation animation) { 
     } 

     public void onAnimationEnd(Animation animation) { 
      Animation anim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.diamond2); 
      findViewById(R.id.img).setAnimation(anim); 
      anim.start(); 
     } 

     public void onAnimationRepeat(Animation animation) { 
     } 
    }); 
+0

Esto no tuvo ningún efecto para mí. De acuerdo con el documento (http://developer.android.com/guide/topics/resources/animation-resource.html), debería poder especificar un startOffset en una animación que debería permitirme 'encadenar' la animación en la forma en que he mostrado – Dan

1

Uso éste funciona, i HVE probado

<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="true"> 
    <translate 
     android:fromXDelta="40%p" android:toXDelta="90%p" 
     android:fromYDelta="10%p" android:toYDelta="40%p" 
     android:duration="500" android:startOffset="0" 
     /> 
    <translate 
     android:fromXDelta="0%p" android:toXDelta="-40%p" 
     android:fromYDelta="0%p" android:toYDelta="40%p" 
     android:duration="500" android:startOffset="500"/> 
    <translate 
     android:fromXDelta="0%p" android:toXDelta="-40%p" 
     android:fromYDelta="0%p" android:toYDelta="-40%p" 
     android:duration="500" android:startOffset="1000"/> 
    <translate 
     android:fromXDelta="0%p" android:toXDelta="40%p" 
     android:fromYDelta="0%p" android:toYDelta="-40%p" 
     android:duration="500" android:startOffset="1500"/> 
    </set> 
0

utilizar el código XML animación. Funciona:

<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="true"> 
<translate 
    android:fromXDelta="40%" android:toXDelta="90%" 
    android:fromYDelta="10%" android:toYDelta="40%" 
    android:duration="500" android:startOffset="0"/> 
<translate 
    android:fromXDelta="90%" android:toXDelta="40%" 
    android:fromYDelta="40%" android:toYDelta="90%" 
    android:duration="500" android:startOffset="500"/> 
<translate 
    android:fromXDelta="40%" android:toXDelta="10%" 
    android:fromYDelta="90%" android:toYDelta="40%" 
    android:duration="500" android:startOffset="1000"/> 
<translate 
    android:fromXDelta="10%" android:toXDelta="40%" 
    android:fromYDelta="40%" android:toYDelta="10%" 
    android:duration="500" android:startOffset="1500"/> 
</set>