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 ImageView
mit Alpha 0.2
und am Ende möchte ich ImageView
mit 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.2
bis 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 1
zu 0.2
. Es sieht so aus, als würde Alpha von ImageView
mit Alpha von Animation multipliziert ...
fillAfter
Attribut: developer.android.com/reference/android/view/animation/…fillEnabled
auf wahr gesetzt?Antworten:
Versuche dies
AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f); animation1.setDuration(1000); animation1.setStartOffset(5000); animation1.setFillAfter(true); iv.startAnimation(animation1);
quelle
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); } });
quelle
.setListener(null);
Wenn Sie sich nur fragen, ob Sie möglicherweise andere Listener entfernen / stören würden , z. B. onClick / onTouch-Listener?• •
Kotlin Version
Einfach so verwenden
ViewPropertyAnimator
:iv.alpha = 0.2f iv.animate().apply { interpolator = LinearInterpolator() duration = 500 alpha(1f) startDelay = 1000 start() }
quelle
Das Einstellen von Alpha
1
vor 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.
quelle
Das "
setStartOffset
" sollte kleiner sein, sonst beginnt die Animation bei der Ansicht Alpha0.xf
und wartet auf den Startversatz, bevor sie animiert wird1f
. 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);
quelle
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 AnimationImageView
der 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:
Animationsparameter bearbeiten Ihre LayoutParams in den Methoden setFillAfter \ setFillBefore .
quelle
<ImageView android:id="@+id/listViewIcon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/settings"/>
android:alpha=0.2
Aus XML-> ImageView entfernen .quelle
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) } }
quelle
View.setOnTouchListener { v, event -> when (event.action) { MotionEvent.ACTION_DOWN -> { v.alpha = 0f v.invalidate() } MotionEvent.ACTION_UP -> { v.alpha = 1f v.invalidate() } } false }
quelle