###问题描述 写了一个透明动画(AlphaAnimation),很简单,就是让一个图片从不透明到透明循环两次。 点击按钮,执行动画,动画却没有执行。但是使用Debug发现,代码确实执行了,只是没有显示出效果。 还有一个奇怪的情况,就是当我点击了按钮,且代码执行之后,让当前activity重写走一遍onResume方法,动画效果就展示出来了。 代码如下

方式一:代码中动态设置透明动画

//透明动画(AlphaAnimation)

public void btAlphaAnimation() {

//创建透明动画对象

Animation animation = new AlphaAnimation(1, 0);

//添加属性:动画播放时长

animation.setDuration(1000);

//添加属性:设置重复播放一次(总共播放两次)

animation.setRepeatCount(1);

//设置动画重复播放的模式

animation.setRepeatMode(Animation.RESTART);

//给图片控件设置动画

ivPenguin.setAnimation(animation);

//启动

animation.start();

}

xml 中配置并在activity中取调用

android:duration="2000"

android:fromAlpha="1.0"

android:repeatCount="1"

android:repeatMode="reverse"

android:toAlpha="0.0">

//下面是activity中执行代码

Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_my_alpha);

ivPenguin.setAnimation(animation);

animation.start();

###不知道小伙们看到这里是否有发现问题?

问题就出在:setAnimation() 这个方法上,如果使用:startAnimation()方法,则不会出现上述的问题。

####两个方法的源码如下 setAnimation

public void setAnimation(Animation animation) {

mCurrentAnimation = animation;

if (animation != null) {

// If the screen is off assume the animation start time is now instead of

// the next frame we draw. Keeping the START_ON_FIRST_FRAME start time

// would cause the animation to start when the screen turns back on

if (mAttachInfo != null && mAttachInfo.mDisplayState == Display.STATE_OFF

&& animation.getStartTime() == Animation.START_ON_FIRST_FRAME) {

animation.setStartTime(AnimationUtils.currentAnimationTimeMillis());

}

animation.reset();

}

}

startAnimation

public void startAnimation(Animation animation) {

animation.setStartTime(Animation.START_ON_FIRST_FRAME);

setAnimation(animation);

invalidateParentCaches();

invalidate(true);

}

其实通过源码可以看到,startAnimation方法的底层也调用了setAnimation这个方法。但是startAnimation还执行了invalidate(true),而该方法的作用大家应该了解,是用于UI刷新的。动画设置后,肯定需要UI的刷新才能展示出效果。

PS:很高兴能和大家分享这样一遍能解决BUG的文章,期待以后能和大家分享更多更有意义的文章。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐