首先感谢类库作者。
这个是一个定义了各种TypeEvaluator的类库,并通过TypeEvaluator来生成一个值动画对象。
Glider.class
public static ValueAnimator glide(Skill skill, float duration, ValueAnimator animator) { return Glider.glide(skill, duration, animator, null); } public static ValueAnimator glide(Skill skill, float duration, ValueAnimator animator, BaseEasingMethod.EasingListener... listeners) { BaseEasingMethod t = skill.getMethod(duration); if (listeners != null) t.addEasingListeners(listeners); animator.setEvaluator(t); return animator; } public static PropertyValuesHolder glide(Skill skill, float duration, PropertyValuesHolder propertyValuesHolder) { propertyValuesHolder.setEvaluator(skill.getMethod(duration)); return propertyValuesHolder; }这个就是使用的关键类,由上面的方法可以看出该类可以生成ValueAnimator和PropertyValuesHolder对象,在方法的参数总涉及到了一个Skill对象,这是一个枚举类,定义了所有重写的TypeEvaluator对象,并可以通过方法来获得对应的实例。
Skill.class
public enum Skill { BackEaseIn(BackEaseIn.class), BackEaseOut(BackEaseOut.class), BackEaseInOut(BackEaseInOut.class), BounceEaseIn(BounceEaseIn.class), BounceEaseOut(BounceEaseOut.class), BounceEaseInOut(BounceEaseInOut.class), CircEaseIn(CircEaseIn.class), CircEaseOut(CircEaseOut.class), CircEaseInOut(CircEaseInOut.class), CubicEaseIn(CubicEaseIn.class), CubicEaseOut(CubicEaseOut.class), CubicEaseInOut(CubicEaseInOut.class), ElasticEaseIn(ElasticEaseIn.class), ElasticEaseOut(ElasticEaseOut.class), ExpoEaseIn(ExpoEaseIn.class), ExpoEaseOut(ExpoEaseOut.class), ExpoEaseInOut(ExpoEaseInOut.class), QuadEaseIn(QuadEaseIn.class), QuadEaseOut(QuadEaseOut.class), QuadEaseInOut(QuadEaseInOut.class), QuintEaseIn(QuintEaseIn.class), QuintEaseOut(QuintEaseOut.class), QuintEaseInOut(QuintEaseInOut.class), SineEaseIn(SineEaseIn.class), SineEaseOut(SineEaseOut.class), SineEaseInOut(SineEaseInOut.class), Linear(Linear.class); private Class easingMethod; private Skill(Class clazz) { easingMethod = clazz; } public BaseEasingMethod getMethod(float duration) { try { return (BaseEasingMethod)easingMethod.getConstructor(float.class).newInstance(duration); } catch (Exception e) { e.printStackTrace(); throw new Error("Can not init easingMethod instance"); } } }上面所有的属性值的计算对象都是继承自BaseEasingMethod类,该类实现了TypeEvaluator接口:
BaseEasingMethod.class
public abstract class BaseEasingMethod implements TypeEvaluator<Number> { protected float mDuration; private ArrayList<EasingListener> mListeners = new ArrayList<EasingListener>(); public interface EasingListener { public void on(float time, float value, float start, float end, float duration); } public void addEasingListener(EasingListener l) { mListeners.add(l); } public void addEasingListeners(EasingListener... ls) { for (EasingListener l : ls) { mListeners.add(l); } } public void removeEasingListener(EasingListener l) { mListeners.remove(l); } public void clearEasingListeners() { mListeners.clear(); } public BaseEasingMethod(float duration) { mDuration = duration; } public void setDuration(float duration) { mDuration = duration; } @Override public final Float evaluate(float fraction, Number startValue, Number endValue) { //计算出当前所处的时间 float t = mDuration * fraction; //起始属性值 float b = startValue.floatValue(); //属性值的最大值 float c = endValue.floatValue() - startValue.floatValue(); //时间 float d = mDuration; //传入抽象方法 float result = calculate(t, b, c, d); //遍历监听器集合,调用方法 for (EasingListener l : mListeners) { l.on(t, result, b, c, d); } return result; } public abstract Float calculate(float t, float b, float c, float d); }
该类中定义了一个持续时间,一个存放监听器的集合,evaluate方法主要是计算出各种值后把参数传入calculate抽象方法,具体看各个子类中calculate方法的实现。具体的效果可以看应用中的呈现。