2010-10-25 18 views
5

He tomado un xml de animación directamente desde los documentos de Android, y como por lo que puedo ver, no funciona en mi emulador de actualización 2.1 1 o mi actualización 2.1 de un dispositivo Galaxy S.Android animation startOffset roto o con errores?

Específicamente, estoy tratando de crear una animación a pulsar una vista (es decir, hacer que sea más pequeño que uno más grande en la animación) Este es el margen de beneficio muy simple:

<?xml version="1.0" encoding="utf-8"?> 
<set 
     xmlns:android="http://schemas.android.com/apk/res/android"> 
     <scale 
       android:fromXScale="1.0" 
       android:toXScale="0.5" 
       android:fromYScale="1.0" 
       android:toYScale="0.5" 
       android:pivotX="50%" 
       android:pivotY="50%" 
       android:duration="1000" /> 
       <set android:startOffset="1000"> 
         <scale 
         android:fromXScale="0.5" 
         android:toXScale="1.0" 
         android:fromYScale="0.5" 
         android:toYScale="1.0" 
         android:pivotX="50%" 
         android:pivotY="50%" 
         android:duration="1000" /> 
       </set> 
</set> 

Entonces, ¿qué estoy tratar de lograr es reducir la vista de su tamaño a la mitad en un segundo, luego aumentarla a su tamaño original en un segundo. Por lo tanto, para volver a iterar, más de dos segundos debería ir desde original -> medio tamaño -> original.

Lo que en realidad sucede es que encaje de forma instantánea a la mitad del tamaño de vistas (a pesar de que fromX/YScale está a 1,0) y después se realiza la animación de más de dos segundos y vuelva a encajar al tamaño original después.

¿Alguien más puede probar esto rápidamente? Si otros ven este comportamiento Lo enviaré como un error. Simplemente no puedo creer que algo tan básico podría romperse?

Además, la copia de esta animación bajo el "Tween Animación" la partida en esta página http://developer.android.com/guide/topics/graphics/2d-graphics.html palabra por palabra tampoco animar según dice la página. Parece estar roto exactamente de la misma manera!

¿Alguien tiene alguna idea?

Gracias!

Andy.

Respuesta

3

Quité la segunda etiqueta <set>, por lo que solo hay una <set> con dos hijos <scale>. Esto hizo que un ciclo funcionara bien pero no se repitió. Tal vez tenga que escuchar la finalización de la animación y reiniciarla manualmente (para que los desplazamientos comiencen desde 0 cada vez).

En el lado brillante que era capaz de utilizar repeatMode para lograr el efecto parece que quieres, con una sola etiqueta:

<scale xmlns:android="http://schemas.android.com/apk/res/android" 
     android:repeatMode="reverse" 
     android:fromXScale="1.0" 
     android:toXScale="0.5" 
     android:fromYScale="1.0" 
     android:toYScale="0.5" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:duration="1000" /> 
+0

Casi allí!Necesitaba agregar android: repeatCount = "1" para que funcionara; de lo contrario, realiza la animación de escalamiento horizontal y retrocede (en lugar de animar hacia atrás). ¡De cualquier forma funciona con esta adición! ¡Gracias un montón! :) En una nota al margen, en realidad probé este enfoque, todo en el código, pero no se repitió, ¡simplemente se rompió a pesar de la repetición! ¡Los documentos de Android fallan de nuevo! ;) – Andy

+0

Lo siento, olvidé ese pequeño detalle (que había hecho en código, no en XML). –

5

Algo que recientemente he descubierto y es parcialmente responsable de la conducta no deseada de tu animación es el hecho de que muchos atributos XML utilizados en la etiqueta <set> ¡no funcionan!

En el ejemplo de código que tiene <set android:startOffset="1000">

Debido a un error ridículo/defecto, Android ignorará este atributo lo que hará que su segundo hijo <set> de animaciones para comenzar simultáneamente con sus padres <set>

Lo que hace esto es aún más frustrante porque este atributo funciona programáticamente en código, setStartOffset(), pero no en XML.

Pasé unas horas frustrantes averiguar qué atributos de trabajo en el código y XML para AnimationSet s y presentó un informe de error/problema aquí: Issue 17662

En resumen:

setRepeatCount()/android : repeatCount

Este atributo (así como repeatMode) no funciona en código o XML. Esto hace que repetir un conjunto completo de animaciones sea difícil.

setDuration()/android: duración

Ajuste esto en un AnimationSet en código funciona (por encima de todas las duraciones de los niños animaciones), pero no cuando se incluye en la etiqueta en XML

setFillAfter()/android: fillAfter

Esto funciona tanto en código como en XML para la etiqueta. Extrañamente, he conseguido que también funcione sin la necesidad de configurar fillEnabled en true.

setFillBefore()/android: fillBefore

parece no tener efecto/ignorados en el código y XML

setFillEnabled()/android: fillEnabled

Parece que no tiene efecto/ignorado tanto en código como en XML. Todavía puedo obtener fillAfter para trabajar incluso sin incluir fillEnabled o estableciendo fillEnabled en falso.

setStartOffset()/android: StartOffset

Esto sólo funciona en el código y no XML.

No hace falta decir que esto provoca una frustración innecesaria.

2

Pruebe los siguientes códigos. Lo que falta es repeatMode = "-1" en la respuesta anterior. Luego verá que la imagen vibra indefinidamente sin usar el oyente.

En res/animal/pulsate.xml:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > 
<scale 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="1000" 
    android:fromXScale="0.5" 
    android:fromYScale="0.5" 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:repeatMode="reverse" 
    android:repeatCount="-1" 
    android:toXScale="1.0" 
    android:toYScale="1.0" /> 

En archivo Java:

Animation animPulsate = AnimationUtils.loadAnimation(JoinRecipeClubActivity.this, R.anim.pulsate); 
ImageView ivFinger = (ImageView) findViewById(R.id.wivFinger); 
ivFinger.startAnimation(animPulsate);