android中为我们定义了几种常见的动画:
AlphaAnimation:透明度变化动画
RotateAnimation:旋转动画
ScaleAnimation: 缩放动画
TranslateAnimation:位置变化动画
但这是不够的,很多时候我们需要实现自己的动画,查看任何一个类的源码,比如AlphaAnimation,可以发现他们都是继承自Animation基类,并且都重写了initialize,applyTransformation方法。于是我们也按部就班的做,一般来说applyTransformation方法是必须重写的。
一个最简单控制透明度变化的动画:
class AlphaAnimation extends Animation {
@Override
protected void applyTransformation(float interpolatedTime,
Transformation t) {
t.setAlpha(interpolatedTime);
}
}
一个左右抖动的动画,当然也可以使用android自带的那个抖动。
/**
* 左右抖动
* @author reyo
*
*/
class ShakeAnimation extends Animation {
private int shakeTimes=7;//摇摆次数
private int shakeRange=50;//摇摆幅度
public ShakeAnimation(){
}
public ShakeAnimation(int shakeTimes,int shakeRange){
this.shakeTimes = shakeTimes;
this.shakeRange = shakeRange;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
}
@Override
protected void applyTransformation(float interpolatedTime,Transformation t) {
int dx=(int)(shakeRange*Math.sin(interpolatedTime*Math.PI*shakeTimes));
int dy=0;
t.getMatrix().setTranslate(dx,dy);
}
}
控制小球做圆周运动的动画,可以实现类似火星,金星,地球围绕太阳转的效果。
/**
* 圆周运动
* @author reyo
*
*/
class CircleAnimation extends Animation {
private int r=100;//旋转半径
private int angle=360;//旋转角度
public CircleAnimation(){
}
public CircleAnimation(int r,int angle){
this.r = r;
this.angle = angle;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
}
@Override
protected void applyTransformation(float interpolatedTime,Transformation t) {
int dx=(int)(r*Math.cos(interpolatedTime*Math.PI*angle/180));
int dy=(int)(r*Math.sin(interpolatedTime*Math.PI*angle/180));
t.getMatrix().setTranslate(dx,dy);
}
}
如果你数学学的足够好,那么可以实现更复杂的动画,我这里只是运用了几个简单的sin,cos罢了,点到为止!