web-dev-qa-db-fra.com

Android Animation Alpha

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 ...

51
wioskamala

Essaye ça

AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(1000);
animation1.setStartOffset(5000);
animation1.setFillAfter(true);
iv.startAnimation(animation1);
85
Vaibhav Agarwal

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);
         }
    });
18
Julián M.

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.

15
Iván Pérez

Kotlin Version

Utilisez simplement ViewPropertyAnimator comme ceci:

iv.alpha = 0.2f
iv.animate().apply {
    interpolator = LinearInterpolator()
    duration = 500
    alpha(1f)
    startDelay = 1000
    start()
}
10
aminography

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.

1
Pavlik Zavarski

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:

  • LayoutParams of Animated View
  • Paramètres d'animation.

Les paramètres d'animation manipulent vos LayoutParams selon les méthodes setFillAfter\setFillBefore.

1
Sergey Shustikov