5 votes

Android 2.3 : bug de l'animation "Grow/Shrink" ?

Pour mon application, j'essaie d'ajouter une animation [croissance/rétrécissement + changement d'alpha] à chaque ImageView dans ma mise en page. J'ai réussi à faire fonctionner les animations et à faire persister chacune d'entre elles une fois qu'elles sont terminées en définissant le paramètre fillAfter="true" pour mes deux fichiers XML (grow.xml et shrink.xml). Cependant, il semble qu'il y ait un bogue d'animation bizarre qui fait que les images non sélectionnées s'agrandissent et reviennent ensuite à leur taille normale lorsque je configure le paramètre fillAfter="true pour shrink.xml ! Je vais vous expliquer le fonctionnement de l'application, puis vous donner un scénario pour que ce soit plus clair :

Initialement, toutes les images ont leur niveau alpha fixé à 50%. Lorsque je clique sur une image particulière, elle passe à 120% et son niveau alpha devient 100% (effet "light up"). Lorsque je clique sur une autre image, l'image précédemment sélectionnée rétrécit à 100% et son niveau d'alpha revient à 50%, tandis que l'image actuellement sélectionnée s'agrandit comme décrit précédemment.

Dans ma mise en page, j'ai trois images de taille égale placées en ligne. Je clique sur la première image, puis sur la deuxième, puis à nouveau sur la première. OK, aucun problème. Maintenant, je clique sur la troisième image et j'obtiens le même problème bizarre d'accrochage que pour la première image. Savez-vous comment résoudre ce problème ?

J'ai essayé :

  1. image.setAlpha(...) pour éviter d'avoir à définir le niveau d'alpha dans shrink.xml puis d'appeler fillAfter="true" mais malheureusement, c'est un appel de l'API 11.
  2. la mise en place de la fillAfter de mes balises alpha seulement pour vrai dans shrink.xml
  3. en appelant image.startAnimation(fadeOut) juste après une animation de rétrécissement mais ça a l'air horrible.
  4. Remplacement de onAnimationEnd() mais cet appel n'est jamais atteint( ??)

shrink.xml :

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fillAfter="true"> <scale android:fromXScale="1.2" android:toXScale="1.0" android:fromYScale="1.2" android:toYScale="1.0" android:duration="300" android:pivotX="50%" android:pivotY="50%"/> <alpha android:fromAlpha="1.0" android:toAlpha="0.5" android:duration="300"/> </set>

grow.xml

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fillAfter="true"> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:fromXScale="1.0" android:toXScale="1.20" android:fromYScale="1.0" android:toYScale="1.20" android:duration="300" android:pivotX="50%" android:pivotY="50%" /> <alpha android:fromAlpha="0.5" android:toAlpha="1.0" android:duration="300"/> </set>

fade_out.xml :

<?xml version="1.0" encoding="UTF-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:startOffset="300" android:fromAlpha="1.0" android:toAlpha="0.5" android:fillAfter="true"> </alpha>

main.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> <ImageView android:id="@+id/image1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="20dip" android:paddingRight="20dip" android:src="@drawable/image1"/> <ImageView android:id="@+id/image2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="20dip" android:paddingRight="20dip" android:src="@drawable/image2"/> <ImageView android:id="@+id/image3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="20dip" android:paddingRight="20dip" android:src="@drawable/image3"/> </LinearLayout>

Test.java :

    public class Test extends Activity {
    private View mSelected;
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final Animation fadeOut = AnimationUtils.loadAnimation(this, R.anim.fade_out);
    final Animation grow = AnimationUtils.loadAnimation(this, R.anim.grow);
    final Animation shrink = AnimationUtils.loadAnimation(this, R.anim.shrink);

    OnClickListener listener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (mSelected == v) 
                return;

            if (mSelected != null) 
                mSelected.startAnimation(shrink);

            mSelected = v;
            mSelected.startAnimation(grow);             
        }
    };

    ImageView image1 = (ImageView)findViewById(R.id.image1);
    image1.startAnimation(fadeOut);
    image1.setOnClickListener(listener); 

    ImageView image2 = (ImageView)findViewById(R.id.image2);
    image2.startAnimation(fadeOut);
    image2.setOnClickListener(listener);

    ImageView image3 = (ImageView)findViewById(R.id.image3);
    image3.startAnimation(fadeOut);
    image3.setOnClickListener(listener);
}}

2voto

Ian G. Clifton Points 4648

Le problème est que l'animation de votre psy est toujours attribuée aux autres vues. Lorsque vous appelez mSelected.startAnimation(), vous démarrez l'objet Animation, qui est attaché aux autres vues, de sorte qu'elles s'animent également. Vous pouvez créer une nouvelle instance de l'Animation en changeant mSelected.startAnimation(shrink); à

mSelected.startAnimation(AnimationUtils.loadAnimation(Test.this, R.anim.shrink));

C'est la façon la plus simple (bien qu'inefficace) de résoudre le problème, ou vous pouvez gérer le cycle d'animation vous-même en désassignant les animations des vues ( mSelected.setAnimation(null) ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X