私はアニメーションを持っています:
<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>
およびImageView
:
<ImageView
Android:id="@+id/listViewIcon"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/settings"
Android:alpha="0.2"/>
およびコード:
final Animation anim = AnimationUtils.loadAnimation(this, R.anim.alpha);
final ImageView iv = (ImageView) findViewById(R.id.listViewIcon);
anim .setFillAfter(true);
iv.startAnimation(anim);
したがって、最初はアルファ0.2のImageView
があり、最後にはアルファ1のImageViewが必要です。しかし、そのようには動作しません。
イメージを0.2から1までアニメーション化するには、何を変更する必要がありますか?
さまざまな設定で確認しました-Android:alpha="1.0"
、fromAlpa="1.0"
、toAlpha="0.2"
を設定しました-アルファ1から0.2まで、期待どおりに動作します。 ImageView
のアルファにアニメーションのアルファを掛けたように見えます...
これを試して
AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(1000);
animation1.setStartOffset(5000);
animation1.setFillAfter(true);
iv.startAnimation(animation1);
少し遅れるかもしれませんが、Androidドキュメントで lovely solution が見つかりました。
//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
に設定するとうまくいきました:
AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(500);
iv.setAlpha(1f);
iv.startAnimation(animation1);
少なくとも私のテストでは、アニメーションを開始する前にアルファを設定するため、ちらつきはありません。正常に動作します。
Kotlin Version
次のようにViewPropertyAnimator
を使用します。
iv.alpha = 0.2f
iv.animate().apply {
interpolator = LinearInterpolator()
duration = 500
alpha(1f)
startDelay = 1000
start()
}
「setStartOffset
」は小さくする必要があります。そうでない場合、アニメーションはビューalpha 0.xf
で開始し、1f
にアニメートする前に開始オフセットを待機します。次のコードが役立つことを願っています。
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"/>
XML-> ImageViewからAndroid:alpha=0.2
を削除します。
うーん...
問題は間違っており、おそらくAndroid APIのアニメーションの適切な操作に問題があります。
実際、コードにアルファ値0.2fを設定すると、Androidのxmlファイルの設定に基づいているということです:
0.2f = 0.2f of 0.2f (20% from 100%) ie from 0.2f / 5 = 0.04f
1f = 0.2f
あなたのアニメーションは実際に動作します.04fから0.2f
flag setFillAfter(true)
は確かに機能しますが、アニメーションの最後にImageView
のアルファ値は1ではなく.2fになることを理解する必要があります。アニメーションで許容できる値(一種の最大アルファチャネル)。
したがって、目的の結果を得るには、すべてのロジックをコードに伝え、xmlで決定するのではなく、コードでアニメーションを操作する必要があります。
アニメーションは次の2つの要素に直接依存することを理解してください。
アニメーションパラメータは、setFillAfter\setFillBeforeメソッドでLayoutParamsを操作します。