我正在尝试使用动画淡出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设置为零,如下所示,但图像始终没有出现时间。为什么不呢?
尽管fromAlpha
和toAlpha
参数显然没有记录,但它们似乎以乘法的方式起作用。零的100%仍然是零。我通过将alpha启动到一个非常低的值来验证这一点,我可以看到动画导致alpha从低值启动并渐变为透明。
为了让它发挥作用,我必须创建一个AnimationListener,重载onAnimationEnd,并将alpha设置为零。为什么?
由于动画的效果是临时的,因此需要在动画之后将对象设置为透明。在开始动画之前,还必须确保将对象重置为不透明。
看起来您可以从API 11中开始使用ObjectAnimator
来直接使用而不是乘法来设置alpha(或任何其他属性的)值。