我正在尝试使用动画淡出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" />
答案 0 :(得分:7)
当您开始制作动画时,它会根据您当前所看到的视图进行操作,根据您提供的动画制作动画,但 实际上并未实际更改视图的状态 即可。
这可能会让人感到困惑,但在第一种情况下,在动画结束后,ImageView只会回到动画前的样子 - 在你的情况下,正常的不透明。
在你的第二个例子中,你在动画开始之前将alpha设置为零,所以当动画开始播放时,图像已经不可见了,因此它会动画这个不可见的ImageView - 你无法看到。
因此,所需的顺序是在更改ImageView之前启动动画,让它播出,然后在动画结束的那一刻,改变ImageView的状态,使其在重新绘制之前消失&# 39;原始状态。这就是覆盖onAnimationEnd()
所做的。
因此,回顾一下,在正确的实现中,有两件事会影响ImageView的绘制方式:
imageView.setAlpha(0);
方法调用,以便在动画完成后保持图像 。注意:为了提高性能,我建议使用
imageView.setVisibility(View.INVISIBLE);
而不是imageView.setAlpha(0);
答案 1 :(得分:1)
我正在尝试使用动画淡出
ImageView
。动画运行,淡出ImageView
,然后图像就会消失 回到完全不透明。为什么会这样?
动画的效果是临时。动画完成后,视图将返回动画开始前的状态。
我尝试将alpha设置为零,如下所示,但之后图像永远不会 出现了一段时间。为什么不呢?
虽然apparently undocumented,但fromAlpha
和toAlpha
参数似乎以乘法方式运行。零的100%仍为零。我通过将alpha启动到一个非常低的值来验证这一点,我可以看到动画导致alpha从低值开始并淡入透明。
为了使其工作,我必须创建一个AnimationListener,重载 onAnimationEnd,并将alpha设置为零。为什么呢?
由于动画的效果是暂时的,因此您需要在动画后将对象设置为透明。在开始动画之前,还必须确保将对象重置为不透明。
看起来您可以使用API 11中的ObjectAnimator
来直接使用而不是乘法来设置alpha(或任何其他属性)值。