1

ImageViewアニメーションを使用してフェードアウトしようとしています。アニメーションが実行され、 がフェードアウトしますImageViewが、画像は完全に不透明に戻ります。なぜこれが起こるのですか?

private void fadeOutImage() {
   final ImageView imageView = (ImageView) activity.findViewById(R.id.imageView);
   imageView.startAnimation(AnimationUtils.loadAnimation(activity, R.anim.fadeout));
}

以下のようにアルファをゼロに設定しようとしましたが、画像は期間を表示しませんでした。なぜだめですか?

private void fadeOutImage() {
   final ImageView imageView = (ImageView) activity.findViewById(R.id.imageView);
   imageView.setAlpha(0);
   imageView.startAnimation(AnimationUtils.loadAnimation(activity, R.anim.fadeout));
}

これを機能させるには、 を作成しAnimationListener、 をオーバーロードしonAnimationEnd、そこでアルファをゼロに設定する必要がありました。なんで?

  final ImageView imageView = (ImageView) activity.findViewById(id);
  Animation animation = AnimationUtils.loadAnimation(activity, R.anim.fadeout);
  animation.setAnimationListener(new AnimationListener() {

     @Override public void onAnimationStart(Animation animation) { 
        imageView.setAlpha(255);
     }

     @Override public void onAnimationRepeat(Animation animation) { }

     @Override public void onAnimationEnd(Animation animation) {
        imageView.setAlpha(0);
     }
  });
  imageView.startAnimation(animation);

アニメーション XML:

<alpha
    android:duration="1500"
    android:fromAlpha="1.0"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toAlpha="0.0" />
4

2 に答える 2

7

アニメーションを開始すると、文字通りビューが現在どのように見えるかを取得し、提供されたアニメーションに従ってアニメーション化しますが、ビューの状態を実際に変更することはありません

これは混乱を招く可能性がありますが、最初のケースでは、アニメーションが終了した後、ImageView はアニメーションの前の状態に戻ります。この場合、通常の不透明です。

2番目の例では、アニメーションの開始前にアルファをゼロに設定しているため、アニメーションの再生が開始されると、画像はすでに非表示になっているため、この非表示の ImageView をアニメーション化します。これは表示されません。

したがって、必要なシーケンスは、ImageView をまったく変更する前にアニメーションを開始し、再生させてから、アニメーションが終了した瞬間に ImageView の状態を変更して、元の状態に再描画される前に消えるようにすることです。これがオーバーライドonAnimationEnd()の機能です。

したがって、要約すると、適切な実装では、ImageView の描画方法に影響を与える 2 つのことがあります。

  • アニメーションの再生中にのみImageView の外観に影響を与えるアニメーション。
  • アニメーションの終了後に画像を非表示に保つためのimageView.setAlpha(0);メソッド呼び出し。

注:おそらくパフォーマンスを向上させるために、使用することをお勧めします

imageView.setVisibility(View.INVISIBLE); 

それ以外のimageView.setAlpha(0);

于 2012-08-29T05:22:45.833 に答える
1

ImageViewアニメーションを使用してフェードアウトしようとしています。アニメーションが実行され、 がフェードアウトしますImageViewが、画像は完全に不透明に戻ります。なぜこれが起こるのですか?

アニメーションの効果は一時的なものです。アニメーションが完了すると、ビューはアニメーションが始まる前の状態に戻ります。

以下のようにアルファをゼロに設定しようとしましたが、画像は期間を表示しませんでした。なぜだめですか?

文書化されていないように見えますが、パラメータfromAlphaとパラメータは乗算toAlpha的に作用するようです。ゼロの 100% はまだゼロです。アルファを非常に低い値から開始してこれを確認したところ、アニメーションによってアルファが低い値から開始され、透明にフェードすることがわかりました。

これを機能させるには、AnimationListener を作成し、onAnimationEnd をオーバーロードし、そこでアルファをゼロに設定する必要がありました。なんで?

アニメーションの効果は一時的なものなので、アニメーション後にオブジェクトを透明に設定する必要があります。また、アニメーションを開始する前に、オブジェクトを不透明にリセットする必要があります。

ObjectAnimatorAPI 11 の開始を使用して、乗算ではなく直接使用してアルファ (または他のプロパティの) 値を設定 できるようです。

于 2012-08-29T14:08:12.857 に答える