AndroidViewAnimations开源框架实现

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();
	}
然后各种动画效果就不分析了。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
For making animations more real, I created another project named Android Easing Functions which is an implementations of easing functions on Android. So, we need to dependent that project. Step 1 Gradle dependencies { compile 'com.nineoldandroids:library:2.4.0' compile 'com.daimajia.easing:library:1.0.1@aar' compile 'com.daimajia.androidanimations:library:1.1.3@aar' } Maven <dependency> <groupId>com.nineoldandroids</groupId> <artifactId>library</artifactId> <version>2.4.0</version> </dependency> <dependency> <groupId>com.daimajia.androidanimation</groupId> <artifactId>library</artifactId> <version>1.1.3</version> <type>apklib</type> </dependency> <dependency> <groupId>com.daimajia.easing</groupId> <artifactId>library</artifactId> <version>1.0.1</version> <type>apklib</type> </dependency> Eclipse Download the following jars, and copy them into your libs directory. NineOldAndroid-2.4.0 AndroidEasingFunctions-1.0.0 AndroidViewAnimations-1.1.3 Step 2 Just like play Yo-yo. YoYo.with(Techniques.Tada) .duration(700) .playOn(findViewById(R.id.edit_area)); Effects Attension Flash, Pulse, RubberBand, Shake, Swing, Wobble, Bounce, Tada, StandUp, Wave Special Hinge, RollIn, RollOut,Landing,TakingOff,DropOut Bounce BounceIn, BounceInDown, BounceInLeft, BounceInRight, BounceInUp Fade FadeIn, FadeInUp, FadeInDown, FadeInLeft, FadeInRight FadeOut, FadeOutDown, FadeOutLeft, FadeOutRight, FadeOutUp Flip FlipInX, FlipOutX, FlipOutY Rotate RotateIn, RotateInDownLeft, RotateInDownRight, RotateInUpLeft, RotateInUpRight RotateOut, RotateOutDownLeft, RotateOutDownRight, RotateOutUpLeft, RotateOutUpRight Slide SlideInLeft, SlideInRight, SlideInUp, SlideInDown SlideOutLeft, SlideOutRight, SlideOutUp, SlideOutDown Zoom ZoomIn, ZoomInDown, ZoomInLeft, ZoomInRight, ZoomInUp ZoomOut, ZoomOutDown, ZoomOutLeft, ZoomOutRight, ZoomOutUp Welcome contribute your amazing animation effect. :-D

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值