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();
}
});
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
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