为什么ImageView alpha动画会出现意外行为?

Jef*_*rod 1 android fadeout android-animation

我正试图淡出ImageView使用动画.动画运行,淡出ImageView,然后图像变回完全不透明.为什么会这样?

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

我尝试将alpha设置为零,如下所示,但随后图像从未出现过.为什么不?

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

为了使这个工作,我必须创建一个AnimationListener,重载onAnimationEnd,并将alpha设置为零.为什么?

  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);
Run Code Online (Sandbox Code Playgroud)

动画XML:

<alpha
    android:duration="1500"
    android:fromAlpha="1.0"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toAlpha="0.0" />
Run Code Online (Sandbox Code Playgroud)

sky*_*ift 7

当你开始一个动画时,它实际上采用当前视图的任何视图,根据你提供的动画动画它,但实际上并没有真正改变视图的状态.

这可能会让人感到困惑,但在第一种情况下,在动画结束后,ImageView只会返回到动画前的样子 - 在您的情况下,正常的不透明.

在你的第二个例子,你设定的α为零之前的动画开始,所以当动画开始播放时,图像已经是不可见的,所以动画这种无形的ImageView -你可以不看.

因此,所需的顺序是在更改ImageView之前启动动画,让它播出,然后在动画结束的那一刻,更改ImageView的状态,使其在重新绘制到原始状态之前消失.这是最重要的onAnimationEnd().

因此,回顾一下,在正确的实现中,有两个因素会影响ImageView的绘制方式:

  • 动画,它影响ImageView 在动画播放时的外观.
  • imageView.setAlpha(0);方法调用,以保持图像不可见的,一旦动画完成.

注意:为了提高性能,我建议使用

imageView.setVisibility(View.INVISIBLE); 
Run Code Online (Sandbox Code Playgroud)

代替 imageView.setAlpha(0);