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