Android Animation Alpha


73

Ich habe 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>

und ImageView:

<ImageView
    android:id="@+id/listViewIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/settings" 
    android:alpha="0.2"/>  

und Code:

final Animation anim = AnimationUtils.loadAnimation(this, R.anim.alpha);
final ImageView iv = (ImageView) findViewById(R.id.listViewIcon);
anim .setFillAfter(true);
iv.startAnimation(anim);

Also am Anfang habe ich ImageViewmit Alpha 0.2und am Ende möchte ich ImageViewmit Alpha haben 1. Aber so funktioniert es nicht - wenn die Animation beginnt, wird mehr Alpha hinzugefügt und die Animation endet mit Alpha0.2

Was muss ich ändern, um mein Bild von 0.2bis zu animieren 1?

Ich habe mit verschiedenen Einstellungen überprüft - ich gesetzt android:alpha="1.0", fromAlpa="1.0", toAlpha="0.2"funktioniert es wie ich erwartet hatte - von Alpha 1zu 0.2. Es sieht so aus, als würde Alpha von ImageViewmit Alpha von Animation multipliziert ...


Um zu verhindern, dass die Ansicht am Ende auf 0,2 Alpha zurückspringt, verwenden Sie das fillAfterAttribut: developer.android.com/reference/android/view/animation/…
Jave

Das ist nicht der Fall. Alpha geht nicht zu 1. Wenn ich von 1-> 0,2 animiere, funktioniert es gut und bleibt bei 0,2 (ich benutze füllen nach). Wenn ich von 0,2 auf 1 animieren möchte, wird es auf fast 0
ausgeblendet

hast du fillEnabledauf wahr gesetzt?
Jave

Antworten:


99

Versuche dies

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

Entfernen Sie Alpha von Imageview-Eigenschaften und uninsatll App von Ihrem Gerät. reinigen, bauen und wieder installieren. weil es auf meiner Seite funktioniert
Vaibhav Agarwal

Ich möchte kein Alpha entfernen - das Bild sollte mit Alpha 0.2 ausgeblendet werden. Aplication macht einige Sachen und wenn es fertig ist, möchte ich mein Bild auf Alpha 1
animieren lassen.

Bitte überprüfen Sie, ob der bearbeitete Code auf meinem Google Nexus 4 einwandfrei funktioniert. Meine Bildansicht Alpha ist zu Beginn 0,2, aber nach dem Anwenden der Animation wurde sie auf 1,0 geändert und die Änderungen bleiben bestehen.
Vaibhav Agarwal

1
Ich habe es anders gemacht - anstatt Alpha im Layout oder mit setAlpha / setImageAlpha festzulegen, habe ich Animation 0.2-> 1 erstellt und auf Create gesetzt. Jetzt, wenn meine Animation ausgelöst wird, geht es perfekt von 0,2-> 1
wioskamala

38

Könnte etwas spät sein, fand aber eine schöne Lösung in den Android-Dokumenten.

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

1
das ist was ich suche
Radesh

Funktioniert super, danke! .setListener(null);Wenn Sie sich nur fragen, ob Sie möglicherweise andere Listener entfernen / stören würden , z. B. onClick / onTouch-Listener?
Erlend KH

31

• • Kotlin Version

Einfach so verwenden ViewPropertyAnimator:

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

1
Dies ist die einzige funktionierende Lösung, wenn Sie versuchen, beginDelayedTransition mit der Alpha-Animation ImageView.animate zu mischen.
Codierung John

2
Ja! gute Antwort! Es lebe Kotlin!
Oz Shabat

18

Das Einstellen von Alpha 1vor dem Starten der Animation hat bei mir funktioniert:

AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(500);
iv.setAlpha(1f);
iv.startAnimation(animation1);

Zumindest bei meinen Tests gibt es kein Flackern, da vor dem Starten der Animation Alpha eingestellt wurde. Es funktioniert einfach gut.


Dies hat auch bei mir funktioniert (bearbeiten: mein Fehler, ich habe XML-Interferenz: android: alpha = "0"). Ich werde ein bisschen damit herumspielen, aber ich brauche es, um bei 0 zu beginnen, damit das jetzt funktioniert. Vielen Dank.
the_dude_abides

2

Das " setStartOffset" sollte kleiner sein, sonst beginnt die Animation bei der Ansicht Alpha 0.xfund wartet auf den Startversatz, bevor sie animiert wird 1f. Hoffe der folgende Code hilft.

AlphaAnimation animation1 = new AlphaAnimation(0.1f, 1f);

animation1.setDuration(1000);
animation1.setStartOffset(50);

animation1.setFillAfter(true);

view.setVisibility(View.VISIBLE);

view.startAnimation(animation1);

1

Hm...

Die Sache ist falsch und möglicherweise in der ordnungsgemäßen Funktion der Animationen in der Android-API.

Tatsache ist, dass, wenn Sie in Ihrem Code einen Alpha-Wert von 0,2f festlegen, der auf den Einstellungen in der XML-Datei für Android basiert, dies bedeutet:

0.2f = 0.2f of 0.2f (20% from 100%) ie from 0.2f / 5 = 0.04f
1f = 0.2f

Ihre Animation funktioniert also tatsächlich von 0,04f bis 0,2f

flag setFillAfter(true)funktioniert sicherlich, aber Sie müssen verstehen, dass am Ende Ihrer Animation ImageViewder Alpha-Wert 0,2f anstelle von eins angezeigt wird, da Sie in der Animation 0,2f als geringfügig akzeptablen Wert angeben (eine Art maximaler Alpha-Kanal).

Wenn Sie also das gewünschte Ergebnis erzielen möchten, müssen Sie Ihre gesamte Logik in Ihren Code übernehmen und Animationen im Code bearbeiten, anstatt sie in XML zu bestimmen.

Sie sollten verstehen, dass Ihre Animationen direkt von zwei Dingen abhängen:

  • LayoutParams der animierten Ansicht
  • Animationsparameter.

Animationsparameter bearbeiten Ihre LayoutParams in den Methoden setFillAfter \ setFillBefore .


Ja. Du hast recht. Wenn ich die Startlayout-Parameter in meinem Code ändere, hat das wie ein Zauber funktioniert!

1
<ImageView
    android:id="@+id/listViewIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/settings"/>  

android:alpha=0.2Aus XML-> ImageView entfernen .


1

Dies ist meine Erweiterung. Dies ist ein Beispiel für das Ändern von Bildern mit FadIn und FadOut:

fun ImageView.setImageDrawableWithAnimation(@DrawableRes() resId: Int, duration: Long = 300) {    
    if (drawable != null) {
        animate()
            .alpha(0f)
            .setDuration(duration)
             .withEndAction {
                 setImageResource(resId)
                 animate()
                     .alpha(1f)
                     .setDuration(duration)
             }

    } else if (drawable == null) {
        setAlpha(0f)
        setImageResource(resId)
        animate()
            .alpha(1f)
            .setDuration(duration)
    }
}

0
View.setOnTouchListener { v, event ->
    when (event.action) {
        MotionEvent.ACTION_DOWN -> {
            v.alpha = 0f
            v.invalidate()
        }
        MotionEvent.ACTION_UP -> {
            v.alpha = 1f
            v.invalidate()


        }
    }
    false
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.