我想做一个非常简单的alpha动画,但我找不到有效的方法。
我们的想法是在视图上执行此动画:
我尝试用AnimationSet实现它:
AnimationSet animationSet = new AnimationSet(true);
Animation animation1 = new AnimationUtils.loadAnimation(this, android.R.anim.fade_in);
animation1.setDuration(1000);
Animation animation2 = new AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
animation2.setDuration(1000);
animation2.setStartOffset(5000);
Animation animation3 = new AlphaAnimation(0.0f, 0.0f);
animation3.setDuration(4000)
animation3.setStartOffset(6000);
animationSet.add(animation1);
animationSet.add(animation2);
animationSet.add(animation3);
等。
但它接第三个动画与所有alpha动画混乱,我认为这会导致Android管理此类动画的内部不连贯。
有什么想法吗?
谢谢。
答案 0 :(得分:105)
Ok请记住这两点来解决这个问题
如果我想在动画持续时间为1秒的5秒钟后为1.0f to 0.0f
设置动画,则最终为1秒动画,暂停时间为5秒。
要实现这个目标:
setDuration(1000)
(持续时间为1秒)setStartOffset(5000)
(将在5秒后开始)您只需要2个永远循环的动画。
1. 0.0f to 1.0f
暂停5秒,持续时间1秒
2. 1.0f to 0.0f
暂停5秒,持续时间1秒
以下是代码:
animation1 = new AlphaAnimation(0.0f, 1.0f);
animation1.setDuration(1000);
animation1.setStartOffset(5000);
animation2 = new AlphaAnimation(1.0f, 0.0f);
animation2.setDuration(1000);
animation2.setStartOffset(5000);
textView.startAnimation(animation1);
然而,为了永远循环,我将使用AnimationListener
,因为repeatCount是错误的:
animation1 = new AlphaAnimation(0.0f, 1.0f);
animation1.setDuration(1000);
animation1.setStartOffset(5000);
//animation1 AnimationListener
animation1.setAnimationListener(new AnimationListener(){
@Override
public void onAnimationEnd(Animation arg0) {
// start animation2 when animation1 ends (continue)
textView.startAnimation(animation2);
}
@Override
public void onAnimationRepeat(Animation arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationStart(Animation arg0) {
// TODO Auto-generated method stub
}
});
animation2 = new AlphaAnimation(1.0f, 0.0f);
animation2.setDuration(1000);
animation2.setStartOffset(5000);
//animation2 AnimationListener
animation2.setAnimationListener(new AnimationListener(){
@Override
public void onAnimationEnd(Animation arg0) {
// start animation1 when animation2 ends (repeat)
textView.startAnimation(animation1);
}
@Override
public void onAnimationRepeat(Animation arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationStart(Animation arg0) {
// TODO Auto-generated method stub
}
});
textView.startAnimation(animation1);
答案 1 :(得分:17)
有一个更简单的解决方案。
让我们假设您的视图处于GONE状态。为其可见性设置动画:
yourView.setVisibility(View.VISIBLE);
yourView.animate().alpha(1).setDuration(300);
通过相同的方式,您可以添加动画侦听器。
这也适用于缩放和翻译动画。
答案 2 :(得分:0)
尝试一下
val shortAnimationDuration = 1000
yourView.apply {
alpha = 0f
animate()
.alpha(1f)
.setDuration(shortAnimationDuration.toLong())
.setListener(object :AnimatorListenerAdapter(){
override fun onAnimationEnd(animation: Animator?) {
//You can add what you want to do after completing animation
}
})
}
这是淡入动画。如果要淡出,只需交换Alpha值即可。