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

时间:2012-08-29 04:25:53

标签: android android-animation fadeout

我正在尝试使用动画淡出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" />

2 个答案:

答案 0 :(得分:7)

当您开始制作动画时,它会根据您当前所看到的视图进行操作,根据您提供的动画制作动画,但 实际上并未实际更改视图的状态 即可。

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

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

因此,所需的顺序是在更改ImageView之前启动动画,让它播出,然后在动画结束的那一刻,改变ImageView的状态,使其在重新绘制之前消失&# 39;原始状态。这就是覆盖onAnimationEnd()所做的。

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

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

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

imageView.setVisibility(View.INVISIBLE); 

而不是imageView.setAlpha(0);

答案 1 :(得分:1)

  

我正在尝试使用动画淡出ImageView。动画运行,淡出ImageView,然后图像就会消失   回到完全不透明。为什么会这样?

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

  

我尝试将alpha设置为零,如下所示,但之后图像永远不会   出现了一段时间。为什么不呢?

虽然apparently undocumented,但fromAlphatoAlpha参数似乎以乘法方式运行。零的100%仍为零。我通过将alpha启动到一个非常低的值来验证这一点,我可以看到动画导致alpha从低值开始并淡入透明。

  

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

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

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