继承Animation自定义动画

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罢了,点到为止!

你可能感兴趣的:(android)