AndroidViewAnimations开源框架实现

姚鹤龄
2023-12-01

1.这是一个开源的动画库,首先感谢作者的分享。

BaseViewAnimator.class

这个是所有动画对象的基类,主要用来设置动画的属性。

public abstract class BaseViewAnimator {
	public static final long DURATION = 1000;
	private AnimatorSet mAnimatorSet;// 存放动画对象的集合
	private long mDuration = DURATION;// 默认的持续时间

	{
		mAnimatorSet = new AnimatorSet();
	}

	/**
	 * 子类中需要实现的方法
	 * 
	 * @param target
	 */
	protected abstract void prepare(View target);

	/**
	 * 设置目标view
	 * 
	 * @param target
	 * @return
	 */
	public BaseViewAnimator setTarget(View target) {
		reset(target);
		prepare(target);
		return this;
	}

	/**
	 * 开始动画
	 */
	public void animate() {
		start();
	}

	/**
	 * 开始动画
	 */
	public void start() {
		mAnimatorSet.setDuration(mDuration);
		mAnimatorSet.start();
	}

	/**
	 * 重置view上面的状态
	 * 
	 * @param target
	 */
	public void reset(View target) {
		ViewHelper.setAlpha(target, 1);
		ViewHelper.setScaleX(target, 1);
		ViewHelper.setScaleY(target, 1);
		ViewHelper.setTranslationX(target, 0);
		ViewHelper.setTranslationY(target, 0);
		ViewHelper.setRotation(target, 0);
		ViewHelper.setRotationY(target, 0);
		ViewHelper.setRotationX(target, 0);
		ViewHelper.setPivotX(target, target.getMeasuredWidth() / 2.0f);
		ViewHelper.setPivotY(target, target.getMeasuredHeight() / 2.0f);
	}

	/**
	 * 设置延续时间
	 * 
	 * @param duration
	 * @return
	 */
	public BaseViewAnimator setDuration(long duration) {
		mDuration = duration;
		return this;
	}

	/**
	 * 设置开始的延迟时间
	 * 
	 * @param delay
	 * @return
	 */
	public BaseViewAnimator setStartDelay(long delay) {
		getAnimatorAgent().setStartDelay(delay);
		return this;
	}

	public long getStartDelay() {
		return mAnimatorSet.getStartDelay();
	}

	/**
	 * 添加监听器
	 * 
	 * @param l
	 * @return
	 */
	public BaseViewAnimator addAnimatorListener(AnimatorListener l) {
		mAnimatorSet.addListener(l);
		return this;
	}

	public void cancel() {
		mAnimatorSet.cancel();
	}

	public boolean isRunning() {
		return mAnimatorSet.isRunning();
	}

	public boolean isStarted() {
		return mAnimatorSet.isStarted();
	}

	public void removeAnimatorListener(AnimatorListener l) {
		mAnimatorSet.removeListener(l);
	}

	public void removeAllListener() {
		mAnimatorSet.removeAllListeners();
	}

	/**
	 * 设置间插器
	 * 
	 * @param interpolator
	 * @return
	 */
	public BaseViewAnimator setInterpolator(Interpolator interpolator) {
		mAnimatorSet.setInterpolator(interpolator);
		return this;
	}

	public long getDuration() {
		return mDuration;
	}

	/**
	 * 获得动画对象存放的集合
	 * 
	 * @return
	 */
	public AnimatorSet getAnimatorAgent() {
		return mAnimatorSet;
	}

}


Techniques.class

这个类是个枚举类,枚举出了所有实现了得对话对象:

public enum Techniques {

    DropOut(DropOutAnimator.class),
    Landing(LandingAnimator.class),
    TakingOff(TakingOffAnimator.class),

    Flash(FlashAnimator.class),
    Pulse(PulseAnimator.class),
    RubberBand(RubberBandAnimator.class),
    Shake(ShakeAnimator.class),
    Swing(SwingAnimator.class),
    Wobble(WobbleAnimator.class),
    Bounce(BounceAnimator.class),
    Tada(TadaAnimator.class),
    StandUp(StandUpAnimator.class),
    Wave(WaveAnimator.class),

    Hinge(HingeAnimator.class),
    RollIn(RollInAnimator.class),
    RollOut(RollOutAnimator.class),

    BounceIn(BounceInAnimator.class),
    BounceInDown(BounceInDownAnimator.class),
    BounceInLeft(BounceInLeftAnimator.class),
    BounceInRight(BounceInRightAnimator.class),
    BounceInUp(BounceInUpAnimator.class),

    FadeIn(FadeInAnimator.class),
    FadeInUp(FadeInUpAnimator.class),
    FadeInDown(FadeInDownAnimator.class),
    FadeInLeft(FadeInLeftAnimator.class),
    FadeInRight(FadeInRightAnimator.class),

    FadeOut(FadeOutAnimator.class),
    FadeOutDown(FadeOutDownAnimator.class),
    FadeOutLeft(FadeOutLeftAnimator.class),
    FadeOutRight(FadeOutRightAnimator.class),
    FadeOutUp(FadeOutUpAnimator.class),

    FlipInX(FlipInXAnimator.class),
    FlipOutX(FlipOutXAnimator.class),

    FlipOutY(FlipOutYAnimator.class),
    RotateIn(RotateInAnimator.class),
    RotateInDownLeft(RotateInDownLeftAnimator.class),
    RotateInDownRight(RotateInDownRightAnimator.class),
    RotateInUpLeft(RotateInUpLeftAnimator.class),
    RotateInUpRight(RotateInUpRightAnimator.class),

    RotateOut(RotateOutAnimator.class),
    RotateOutDownLeft(RotateOutDownLeftAnimator.class),
    RotateOutDownRight(RotateOutDownRightAnimator.class),
    RotateOutUpLeft(RotateOutUpLeftAnimator.class),
    RotateOutUpRight(RotateOutUpRightAnimator.class),

    SlideInLeft(SlideInLeftAnimator.class),
    SlideInRight(SlideInRightAnimator.class),
    SlideInUp(SlideInUpAnimator.class),
    SlideInDown(SlideInDownAnimator.class),

    SlideOutLeft(SlideOutLeftAnimator.class),
    SlideOutRight(SlideOutRightAnimator.class),
    SlideOutUp(SlideOutUpAnimator.class),
    SlideOutDown(SlideOutDownAnimator.class),

    ZoomIn(ZoomInAnimator.class),
    ZoomInDown(ZoomInDownAnimator.class),
    ZoomInLeft(ZoomInLeftAnimator.class),
    ZoomInRight(ZoomInRightAnimator.class),
    ZoomInUp(ZoomInUpAnimator.class),

    ZoomOut(ZoomOutAnimator.class),
    ZoomOutDown(ZoomOutDownAnimator.class),
    ZoomOutLeft(ZoomOutLeftAnimator.class),
    ZoomOutRight(ZoomOutRightAnimator.class),
    ZoomOutUp(ZoomOutUpAnimator.class);



    private Class animatorClazz;

    private Techniques(Class clazz) {
        animatorClazz = clazz;
    }

    public BaseViewAnimator getAnimator() {
        try {
            return (BaseViewAnimator) animatorClazz.newInstance();
        } catch (Exception e) {
            throw new Error("Can not init animatorClazz instance");
        }
    }
}

YoYo.class

这个类采用了链式api的方式:

通过静态方法将动画对象传入:

 public static AnimationComposer with(Techniques techniques) {
        return new AnimationComposer(techniques);
    }

    public static AnimationComposer with(BaseViewAnimator animator) {
        return new AnimationComposer(animator);
    }
  内部类 AnimationComposer.class就相当于一个builder构造器,用来设置各种属性:

 public static final class AnimationComposer {

        private List<Animator.AnimatorListener> callbacks = new ArrayList<Animator.AnimatorListener>();

        private BaseViewAnimator animator;
        private long duration = DURATION;
        private long delay = NO_DELAY;
        private Interpolator interpolator;
        private View target;

        private AnimationComposer(Techniques techniques) {
            this.animator = techniques.getAnimator();
        }

        private AnimationComposer(BaseViewAnimator animator) {
            this.animator = animator;
        }

        public AnimationComposer duration(long duration) {
            this.duration = duration;
            return this;
        }

        public AnimationComposer delay(long delay) {
            this.delay = delay;
            return this;
        }

        public AnimationComposer interpolate(Interpolator interpolator) {
            this.interpolator = interpolator;
            return this;
        }


        public AnimationComposer withListener(Animator.AnimatorListener listener) {
            callbacks.add(listener);
            return this;
        }

        public YoYoString playOn(View target) {
            this.target = target;
            return new YoYoString(new YoYo(this).play(), this.target);
        }

    }
通过一系列方法设置一系列参数,最后调用

playOn(View target)

public YoYoString playOn(View target) {
            this.target = target;
            return new YoYoString(new YoYo(this).play(), this.target);
        }
来开启动画,实际上最后还是调用了new YoYo(this).play()来开启动画:

private BaseViewAnimator play() {
        animator.setTarget(target);
        animator.setDuration(duration)
                .setInterpolator(interpolator)
                .setStartDelay(delay);

        if (callbacks.size() > 0) {
            for (Animator.AnimatorListener callback : callbacks) {
                animator.addAnimatorListener(callback);
            }
        }

        animator.animate();
        return animator;
    }

animator.animate();是调用如下方法:

/**
	 * 开始动画
	 */
	public void animate() {
		start();
	}

	/**
	 * 开始动画
	 */
	public void start() {
		mAnimatorSet.setDuration(mDuration);
		mAnimatorSet.start();
	}
然后各种动画效果就不分析了。



 类似资料: