J'ai de l'animation:
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/linear_interpolator">
<alpha
Android:fromAlpha="0.2"
Android:toAlpha="1.0"
Android:duration="500"/>
</set>
et ImageView
:
<ImageView
Android:id="@+id/listViewIcon"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/settings"
Android:alpha="0.2"/>
et code:
final Animation anim = AnimationUtils.loadAnimation(this, R.anim.alpha);
final ImageView iv = (ImageView) findViewById(R.id.listViewIcon);
anim .setFillAfter(true);
iv.startAnimation(anim);
Donc au début j'ai ImageView
avec alpha 0.2 et à la fin je veux avoir ImageView avec alpha 1. Mais ça ne marche pas comme ça - quand l'animation commence, plus d'alpha est ajouté et l'animation se termine avec alpha 0.2
Que dois-je changer pour animer mon image de 0,2 à 1?
J'ai vérifié avec différents paramètres - je règle Android:alpha="1.0"
, fromAlpa="1.0"
, toAlpha="0.2"
cela fonctionne comme prévu - de l’alpha 1 à 0,2. Il semble que l'alpha de ImageView
soit multiplié par l'alpha de l'animation ...
Essaye ça
AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(1000);
animation1.setStartOffset(5000);
animation1.setFillAfter(true);
iv.startAnimation(animation1);
Peut-être un peu en retard, mais a trouvé un belle solution dans le Android docs.
//In transition: (alpha from 0 to 0.5)
view.setAlpha(0f);
view.setVisibility(View.VISIBLE);
view.animate()
.alpha(0.5f)
.setDuration(400)
.setListener(null);
//Out transition: (alpha from 0.5 to 0)
view.setAlpha(0.5f)
view.animate()
.alpha(0f)
.setDuration(400)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setVisibility(View.GONE);
}
});
Définition de l'alpha sur 1
avant de commencer l'animation a fonctionné pour moi:
AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(500);
iv.setAlpha(1f);
iv.startAnimation(animation1);
Au moins dans mes tests, il n'y a pas de scintillement à cause de la définition de l'alpha avant de lancer l'animation. Cela fonctionne bien.
Kotlin Version
Utilisez simplement ViewPropertyAnimator
comme ceci:
iv.alpha = 0.2f
iv.animate().apply {
interpolator = LinearInterpolator()
duration = 500
alpha(1f)
startDelay = 1000
start()
}
Le "setStartOffset
" devrait être plus petit, sinon l'animation commence à la vue alpha 0.xf
et attend le début du décalage avant de l'animer en 1f
. J'espère que le code suivant aide.
AlphaAnimation animation1 = new AlphaAnimation(0.1f, 1f);
animation1.setDuration(1000);
animation1.setStartOffset(50);
animation1.setFillAfter(true);
view.setVisibility(View.VISIBLE);
view.startAnimation(animation1);
<ImageView
Android:id="@+id/listViewIcon"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/settings"/>
Retirer Android:alpha=0.2
de XML-> ImageView.
Hm ...
Le problème est que le bon fonctionnement des animations dans l’API Android.
Le fait est que lorsque vous définissez dans votre code la valeur alpha de 0.2f est basée sur les paramètres du fichier XML pour Android, cela signifie que:
0.2f = 0.2f of 0.2f (20% from 100%) ie from 0.2f / 5 = 0.04f
1f = 0.2f
Donc, votre animation fonctionne en fait de 0.04f à 0.2f
flag setFillAfter(true)
fonctionne certainement, mais vous devez comprendre qu'à la fin de votre animation, ImageView
aura la valeur alpha .2f au lieu d'un, car vous spécifiez 0,2f comme valeur marginalement acceptable dans l’animation (une sorte de canal alpha maximum).
Donc, si vous voulez avoir le résultat souhaité, toute votre logique sera reportée dans votre code et manipulera des animations en code au lieu de déterminer en xml.
Vous devez comprendre que vos animations dépendent directement de deux choses:
Les paramètres d'animation manipulent vos LayoutParams selon les méthodes setFillAfter\setFillBefore.