package com.marshalchen.common.uimodule.androidviewhover.proxy; import android.view.View; import android.view.animation.Interpolator; import com.marshalchen.common.uimodule.androidanimations.Techniques; import com.marshalchen.common.uimodule.androidanimations.YoYo; import com.marshalchen.common.uimodule.nineoldandroids.animation.Animator; public class AnimationProxy implements Runnable { private YoYo.AnimationComposer composer = null; private Animator animator = null; private long delay; private long duration; private boolean invisibleWhenDelaying; private View targetView; private Interpolator interpolator; private long startTime = -1; private AnimationProxy(View hoverView, int resId, Techniques technique, long duration, long delay, boolean invisibleWhenDelaying, Interpolator interpolator, Animator.AnimatorListener... listeners){ if(hoverView == null) throw new IllegalStateException("Hover view is null"); View child = hoverView.findViewById(resId); if(child == null) throw new IllegalStateException("Can not find the child view"); if(duration < 0) throw new IllegalArgumentException("Duration can not be less than 0"); if(delay < 0) throw new IllegalArgumentException("Delay can not be less than 0"); this.composer = YoYo.with(technique).duration(duration).delay(delay).interpolate(interpolator); this.targetView = child; this.interpolator = interpolator; this.delay = delay; this.duration = duration; this.invisibleWhenDelaying = invisibleWhenDelaying; for(Animator.AnimatorListener l : listeners) this.composer.withListener(l); } public static AnimationProxy build(View hoverView, int resId, Techniques technique, long duration, long delay, boolean invisibleWhenDelaying, Interpolator interpolator, Animator.AnimatorListener... listeners){ return new AnimationProxy(hoverView, resId, technique, duration, delay, invisibleWhenDelaying, interpolator, listeners); } public static AnimationProxy build(View hoverView, int childId, Animator animator){ return new AnimationProxy(hoverView, childId, animator); } private AnimationProxy(View hoverView, int childId, Animator animator){ if(animator == null) throw new IllegalArgumentException("Animator can not be null"); if(hoverView == null) throw new IllegalArgumentException("hoverView can not be null"); View child = hoverView.findViewById(childId); if(child == null) throw new IllegalArgumentException("Can not find child"); this.targetView = child; this.duration = animator.getDuration(); this.delay = animator.getStartDelay(); this.interpolator = null; this.animator = animator; } public void start(){ startTime = System.currentTimeMillis(); targetView.post(this); } public boolean isDelaying(){ long current = System.currentTimeMillis(); if(current - startTime <= delay) return true; else return false; } @Override public void run() { if(startTime == -1) throw new IllegalStateException("You can not call run directly, you should call start!"); if(!isDelaying()){ if(targetView.getVisibility() != View.VISIBLE) targetView.setVisibility(View.VISIBLE); if(composer!=null){ composer.delay(0); composer.playOn(targetView); } if(animator != null){ animator.setStartDelay(0); animator.start(); } }else{ if(invisibleWhenDelaying && targetView.getVisibility() != View.INVISIBLE){ targetView.setVisibility(View.INVISIBLE); } targetView.post(this); } } public View getTarget(){ return this.targetView; } public void withListener(Animator.AnimatorListener l){ if(composer != null) composer.withListener(l); if(animator != null) animator.addListener(l); } }