为什么ImageView alpha动画的行为出乎意料



我正在尝试使用动画淡出ImageView。动画将运行,淡出ImageView,但随后图像将恢复为完全不透明。为什么会发生这种情况?

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

我试着将alpha设置为零,如下所示,但图像始终没有出现。为什么不呢?

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,并将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);

动画XML:

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

当您启动一个动画时,它会按照视图当前的样子,根据您提供的动画对其进行动画设置,但实际上不会更改视图的状态

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

在第二个示例中,在动画开始之前,将alpha设置为零,因此当动画开始播放时,图像已经不可见,因此它会为这个不可见的ImageView设置动画,而你看不到它。

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

因此,概括一下,在正确的实现中,有两件事会影响ImageView的绘制方式:

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

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

imageView.setVisibility(View.INVISIBLE); 

而不是imageView.setAlpha(0);

我正在尝试使用动画淡出ImageView。动画运行,淡出ImageView,但随后图像继续回到完全不透明。为什么会发生这种情况?

动画的效果是临时的。动画完成后,视图将返回到动画开始前的状态。

我试着将alpha设置为零,如下所示,但图像始终没有出现时间。为什么不呢?

尽管fromAlphatoAlpha参数显然没有记录,但它们似乎以乘法的方式起作用。零的100%仍然是零。我通过将alpha启动到一个非常低的值来验证这一点,我可以看到动画导致alpha从低值启动并渐变为透明。

为了让它发挥作用,我必须创建一个AnimationListener,重载onAnimationEnd,并将alpha设置为零。为什么?

由于动画的效果是临时的,因此需要在动画之后将对象设置为透明。在开始动画之前,还必须确保将对象重置为不透明。

看起来您可以从API 11中开始使用ObjectAnimator来直接使用而不是乘法来设置alpha(或任何其他属性的)值。

最新更新