84

私はアニメーションを持っています:

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

したがって、最初はImageViewalphaを使用し、最後はalphaを使用0.2したいと考えています。しかし、それはそのようには機能しません-アニメーションが開始すると、さらにアルファが追加され、アニメーションはアルファで終了しますImageView10.2

0.2画像を からまでアニメーション化するには、何を変更する必要があり1ますか?

さまざまな設定で確認しました - を設定しましたandroid:alpha="1.0", fromAlpa="1.0",toAlpha="0.2"期待どおりに動作します - アルファ1から0.2. ImageViewアニメーションのアルファにアルファが乗算されているように見えます...

4

10 に答える 10

114

これを試して

AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(1000);
animation1.setStartOffset(5000);
animation1.setFillAfter(true);
iv.startAnimation(animation1);
于 2013-12-17T08:13:01.130 に答える
52

少し遅れているかもしれませんが、Android ドキュメントで素敵な解決策を見つけました。

//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);
         }
    });
于 2018-09-02T18:33:33.167 に答える
3

これは私の拡張機能です。これは FadIn と 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)
    }
}
于 2020-07-30T21:59:31.940 に答える
2

うーん...

これは間違っており、Android API でのアニメーションの適切な操作に問題がある可能性があります。

実際には、コードで alpha 値 0.2f を設定すると、Android の xml ファイルの設定に基づいているということは、次のことを意味します。

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

したがって、実際のアニメーションは0.04f から 0.2f まで機能します

flagsetFillAfter(true)は確かに機能しますが、アニメーションの最後にImageViewアルファ値が 1 ではなく0.2fになることを理解する必要があります。これは、アニメーションで限界許容値 (一種の最大アルファ チャネル) として 0.2f を指定するためです。

したがって、目的の結果が必要な場合は、すべてのロジックをコードに運び、xml で決定する代わりにコードでアニメーションを操作します。

アニメーションは次の 2 つの要素に直接依存していることを理解する必要があります。

  • アニメーション ビューの LayoutParams
  • アニメーション パラメータ。

アニメーション パラメータは、setFillAfter\setFillBeforeメソッドで LayoutParams を操作します。

于 2015-03-07T14:02:42.760 に答える
1
<ImageView
    android:id="@+id/listViewIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/settings"/>  

XML から削除android:alpha=0.2-> ImageView。

于 2015-03-07T13:40:42.683 に答える