web-dev-qa-db-fra.com

Comment charger un fichier XML Animator sur Android par programme?

Selon le site de développement Android , nous pouvons charger la classe AnimatorSet par programme à partir d'un fichier xml situé sur le chemin tel que: res/animator/filename.xml. J'ai donc créé un exemple de projet et j'ai essayé de voir s'il fonctionnait réellement, mais ce n'est pas le cas. Rien ne se passe. Ce serait très bien si je pouvais comprendre ce qui manque et/ou ce que j'ai mal fait. Merci d'avance! Ci-dessous, mon fichier XML animateur et le code Java permettant de charger le fichier XML:

res/animator/sample.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:ordering="sequentially"
    >
  <set>
    <objectAnimator
        Android:propertyName="x"
        Android:duration="500"
        Android:valueTo="400"
        Android:valueType="intType"
        />
    <objectAnimator
        Android:propertyName="y"
        Android:duration="500"
        Android:valueTo="300"
        Android:valueType="intType"
        />
  </set>
  <objectAnimator
      Android:propertyName="alpha"
      Android:duration="500"
      Android:valueTo="1f"
      />
</set>

Et voici mes codes Java pour charger le fichier XML ci-dessus:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
  @Override public void onClick(View view) {
    // Load and start Animaton
    AnimatorSet animSet =
        (AnimatorSet) AnimatorInflater.loadAnimator(view.getContext(), R.animator.sample);
    animSet.setTarget(view);
    animSet.start();
  }
});
8
shoheikawano

Votre ensemble contient un autre ensemble res/animator/sample.xml. Simplifier

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:ordering="sequentially"
    >

  <objectAnimator
      Android:propertyName="alpha"
      Android:duration="500"
      Android:valueTo="1f"
      />
</set>

Vous gonflez le AnimatorSet comme ça

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(getActivity(), R.animator.sample);
set.setTarget(fab); // set the view you want to animate
set.start();

Jusqu'à présent, je n'ai pas trouvé de moyen de gonfler objectAnimator de xml en Java. Je dois l'envelopper dans un Set

25
Raymond Chenon

C'est une erreur dans l'exemple donné dans la documentation.

Essayez de changer le Android:valueType="intType" en Android:valueType="floatType".

Cela fonctionne dans le cas de @RaymondChenon , car il ne modifie pas explicitement le Android:valueType en int, de sorte que le système prend celui par défaut float

Le problème ici est que vous donnez Android:valueType="intType" dans votre animator qui est censé être Android:valueType="floatType" pour la propriété Android:propertyName="x" que vous animez.

Dans le système d’exécution, recherchez setter pour la propriété que vous souhaitez animer. Comme dans votre cas, il recherchera setX(), mais lors de la définition du type d’argument de type int, une incompatibilité est créée. comme il n’existe pas de méthode de ce type, je ne vois pas pourquoi elle ne conduirait pas à un crash.

Regardez les propriétés de View class il existe une méthode setX (float)

Pour plus de compréhension, vous pouvez vous référer Question StackOverflow

1
DeltaCap019