/*
* Copyright (c) 2016 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com>
* All Rights Reserved.
*/
package me.zhanghai.android.douya.ui;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.transitionseverywhere.Transition;
import com.transitionseverywhere.TransitionValues;
public class CrossfadeText extends Transition {
private static final String PROPNAME_TEXT = "android:crossfadeText:text";
public CrossfadeText() {}
public CrossfadeText(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void captureStartValues(TransitionValues transitionValues) {
captureValues(transitionValues);
}
@Override
public void captureEndValues(TransitionValues transitionValues) {
captureValues(transitionValues);
}
private void captureValues(TransitionValues transitionValues) {
if (!(transitionValues.view instanceof TextView)) {
throw new IllegalArgumentException("Target should be a TextView instead of "
+ transitionValues.view.getClass().getName());
}
TextView view = (TextView) transitionValues.view;
transitionValues.values.put(PROPNAME_TEXT, view.getText());
}
@Override
public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
TransitionValues endValues) {
TextView view = (TextView) startValues.view;
CharSequence startText = (CharSequence) startValues.values.get(PROPNAME_TEXT);
CharSequence endText = (CharSequence) endValues.values.get(PROPNAME_TEXT);
view.setText(startText);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.ALPHA, 1, 0, 1);
AnimatorListener listener = new AnimatorListener(view, endText);
animator.addListener(listener);
animator.addUpdateListener(listener);
return animator;
}
private class AnimatorListener extends AnimatorListenerAdapter
implements ValueAnimator.AnimatorUpdateListener {
private TextView mTextView;
private CharSequence mEndText;
private boolean mTextUpdated;
public AnimatorListener(TextView textView, CharSequence endText) {
mTextView = textView;
mEndText = endText;
}
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
if (valueAnimator.getAnimatedFraction() >= 0.5) {
ensureTextUpdated();
}
}
@Override
public void onAnimationEnd(Animator animation) {
ensureTextUpdated();
}
private void ensureTextUpdated() {
if (!mTextUpdated) {
mTextView.setText(mEndText);
mTextUpdated = true;
}
}
}
}