package org.aisen.weibo.sina.ui.widget.io.codetail.animation.arcanimator;
import android.view.View;
import android.view.animation.Interpolator;
import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.ValueAnimator;
import com.nineoldandroids.view.ViewHelper;
import java.lang.ref.WeakReference;
public class ArcAnimator extends Animator {
public static ArcAnimator createArcAnimator(View clipView, View nestView,
float degree, Side side){
return createArcAnimator(clipView, Utils.centerX(nestView), Utils.centerY(nestView),
degree, side);
}
public static ArcAnimator createArcAnimator(View clipView, float endX, float endY,
float degree, Side side){
ArcMetric arcMetric = ArcMetric.evaluate(Utils.centerX(clipView), Utils.centerY(clipView),
endX, endY, degree, side);
return new ArcAnimator(arcMetric, clipView);
}
ArcMetric mArcMetric;
WeakReference<View> mTarget;
WeakReference<ValueAnimator> mAnimator;
float mValue;
private ArcAnimator(ArcMetric arcmetric, View target) {
mArcMetric = arcmetric;
mTarget = new WeakReference<>(target);
mAnimator = new WeakReference<>(
ValueAnimator.ofFloat(arcmetric.getStartDegree(), arcmetric.getEndDegree())
);
mAnimator.get().addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override public void onAnimationUpdate(ValueAnimator animation) {
setDegree((Float) animation.getAnimatedValue());
}
});
}
void setDegree(float degree){
mValue = degree;
View clipView = mTarget.get();
float x = mArcMetric.getAxisPoint().x + mArcMetric.mRadius
* Utils.cos(degree);
float y = mArcMetric.getAxisPoint().y - mArcMetric.mRadius
* Utils.sin(degree);
ViewHelper.setX(clipView,x - clipView.getWidth() / 2);
ViewHelper.setY(clipView,y - clipView.getHeight() / 2);
}
float getDegree(){
return mValue;
}
@Override
public long getStartDelay() {
Animator a = mAnimator.get();
return a == null ? 0 : a.getDuration();
}
@Override
public void setStartDelay(long startDelay) {
Animator a = mAnimator.get();
if(a != null) a.setStartDelay(startDelay);
}
@Override
public ArcAnimator setDuration(long duration) {
Animator a = mAnimator.get();
if(a != null) a.setDuration(duration);
return this;
}
@Override
public long getDuration() {
Animator a = mAnimator.get();
return a == null ? 0 : a.getDuration();
}
@Override
public void setInterpolator(Interpolator value) {
Animator a = mAnimator.get();
if(a != null) a.setInterpolator(value);
}
@Override
public void start() {
super.start();
Animator a = mAnimator.get();
if(a != null) a.start();
}
@Override
public void end() {
super.end();
Animator a = mAnimator.get();
if(a != null) a.end();
}
@Override
public void cancel() {
super.cancel();
Animator a = mAnimator.get();
if(a != null) a.cancel();
}
@Override
public void addListener(AnimatorListener listener) {
Animator a = mAnimator.get();
if(a != null) a.addListener(listener);
}
@Override
public void setupEndValues() {
super.setupEndValues();
Animator a = mAnimator.get();
if(a != null) a.setupEndValues();
}
@Override
public void setupStartValues() {
super.setupStartValues();
Animator a = mAnimator.get();
if(a != null) a.setupStartValues();
}
@Override
public boolean isRunning() {
Animator a = mAnimator.get();
return a != null && a.isRunning();
}
@Override
public String toString() {
return mArcMetric.toString();
}
}