我们知道在Android中Animation是实现动画的类,而AlphaAnimation是其子类,主要实现了透明度渐变的动画。我们可以在xml文件或者使用代码来令其渐隐或渐显。
在实际项目中,也许产品会让你实现先渐显再渐隐的动画,这样使得下一个页面出现的不太突兀,那么怎么实现呢?
其实,实现原理很简单。我们可以参考AlphaAnimation的源码,只需applyTransformation(float interpolatedTime, Transformation t)函数,将其中内容由线性变化变为折线段(先升后降)即可。代码如下:
public class FadeInOutAnimation extends Animation {
/** fade-in到fade-out的转折点的defalut值*/
public static final float DEFALUT_BREAK_POINT = 0.7f;
private float mBreakPoint = 0;//fade-in到fade-out的转折点
private float mFromAlpha;//fade-in的alpha起点
private float mToAlpha;//最终完全显示时的的alpha
public FadeInOutAnimation(float fromAlpha, float toAlpha) {
this(fromAlpha, toAlpha, DEFALUT_BREAK_POINT);
}
public FadeInOutAnimation(float fromAlpha, float toAlpha, float breakpoint) {
mBreakPoint = DEFALUT_BREAK_POINT;
mFromAlpha = fromAlpha;
mToAlpha = toAlpha;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
// TODO Auto-generated method stub
// super.applyTransformation(interpolatedTime, t);
final float alpha = mFromAlpha;
float rate;
//0-mBreakPoint处于fade-in阶段,mBreakPoint-1处于fade-out阶段
if(interpolatedTime < mBreakPoint){
rate = mBreakPoint - 0;
t.setAlpha(alpha + ((mToAlpha - alpha) * interpolatedTime / rate ));
} else {
rate = 1 - mBreakPoint;
t.setAlpha(mToAlpha - ((mToAlpha - alpha) * (interpolatedTime - mBreakPoint) / rate));
}
}
@Override
public boolean willChangeBounds() {
// TODO Auto-generated method stub
// return super.willChangeBounds();
return false;
}
@Override
public boolean willChangeTransformationMatrix() {
// TODO Auto-generated method stub
// return super.willChangeTransformationMatrix();
return false;
}
}