继承Animation自定义动画

来源:互联网 发布:新加坡航空公司 知乎 编辑:程序博客网 时间:2024/06/05 15:49
android中为我们定义了几种常见的动画:

AlphaAnimation:透明度变化动画

RotateAnimation:旋转动画

ScaleAnimation: 缩放动画

TranslateAnimation:位置变化动画

但这是不够的,很多时候我们需要实现自己的动画,查看任何一个类的源码,比如AlphaAnimation,可以发现他们都是继承自Animation基类,并且都重写了initialize,applyTransformation方法。于是我们也按部就班的做,一般来说applyTransformation方法是必须重写的。
一个最简单控制透明度变化的动画:
class AlphaAnimation extends Animation {@Overrideprotected 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);      }@Overrideprotected 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);      }@Overrideprotected 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罢了,点到为止!
原创粉丝点击