经常看到有些应用里面TextView会有淡入淡出效果,给人一种眼前一亮的感觉,如下图:
这篇文章简单介绍下它的代码实现。
首先,可以先将此动画分解成两部分,即淡入和淡出,淡入的时候,从底部向中心点移动,移动的过程中,文字越变越清晰;
淡出的时候,从中心点向顶部移动,移动过程中,文字越变越模糊。这其中涉及到两个属性:translationY(控件在纵向上的移动距离)、alpha(控件的不透明度)
本章将利用属性动画实现其效果。
首先,看淡出的实现:
privateObjectAnimator mFadeOutObjectAnimator;//由于淡出,是向上移动,坐标为负,这里设定向上移动150个像素
mFadeOutObjectAnimator = ObjectAnimator.ofFloat(mFadeinoutTv, "translationY", 0, -150);//动画执行时间设定为500毫秒
mFadeOutObjectAnimator.setDuration(500);
mFadeOutObjectAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {
@Overridepublic voidonAnimationUpdate(ValueAnimator animation) {//当前动画时间点的动画值,在0到-150之间
float value = (float) animation.getAnimatedValue();//由于不透明度取值为0-1,故而除以150,value/150取值在-1到0之间
mFadeinoutTv.setAlpha(1 + value/150);
}
});
mFadeOutObjectAnimator.addListener(newAnimator.AnimatorListener() {
@Overridepublic voidonAnimationStart(Animator animation) {
}
@Overridepublic voidonAnimationEnd(Animator animation) {//动画执行完毕后修改TextView的值
mFadeinoutTv.setText("124");
}
@Overridepublic voidonAnimationCancel(Animator animation) {
}
@Overridepublic voidonAnimationRepeat(Animator animation) {
}
});
mFadeOutObjectAnimator.start();
以上代码大概意思为将TextView以一定规律向上从中心点向上移动150像素,同时将TextView的不透明度从1慢慢变到0,达到TextView淡出的效果。效果如下图:
我们再来看看淡入的实现:
privateObjectAnimator mFadeInObjectAnimator;//由于是淡入,从底部向中心点移动,移动距离为150像素
mFadeInObjectAnimator = ObjectAnimator.ofFloat(mFadeinoutTv, "translationY", 150, 0);//动画执行时间设置为500毫秒
mFadeInObjectAnimator.setDuration(500);//动画推迟100毫秒执行
mFadeInObjectAnimator.setStartDelay(100);
mFadeInObjectAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {
@Overridepublic voidonAnimationUpdate(ValueAnimator animation) {//当前动画时间点的动画值
float value = (float) animation.getAnimatedValue();//动画值在150-0之间变化,而alpha在0-1之间变化,故而alue/150
mFadeinoutTv.setAlpha(1 - value/150);
}
});
mFadeInObjectAnimator.start();
以上代码大概意思为将TextView以一定规律从底部向中心点移动,同时将TextView的不透明度从0慢慢变到1,达到TextView淡入的效果。效果如下图:
好了,现在淡入、淡出两个动画都实现了,只要组合起来执行便可,如下代码:
//AnimatorSet是可以让几个动画组合在一起执行的类
privateAnimatorSet mAnimatorSet;
mAnimatorSet= newAnimatorSet();//先淡出再淡入
mAnimatorSet.play(mFadeOutObjectAnimator).before(mFadeInObjectAnimator);
mAnimatorSet.start();
效果图:
源码:
原文:/tyrion/p/4337630.html