package com.xiaomi.smarthome.common.ui.widget; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Camera; import android.graphics.Matrix; import android.os.Handler; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Animation; import android.view.animation.Transformation; import android.widget.TextSwitcher; import android.widget.TextView; import android.widget.ViewSwitcher; import java.util.Timer; import java.util.TimerTask; import com.xiaomi.common.R; public class AutoTextView extends TextSwitcher implements ViewSwitcher.ViewFactory { private static final String TAG = AutoTextView.class.getSimpleName(); private boolean mIsDown = false; private Context mContext; private Handler mHandler; private Timer mAnimTimer; private String mUpText; private String mDownText; private float mTextSize; private int mTextColor; //mInDownAnim,mOutDownAnim分离构成向下翻页的进出动画 private Rotate3dAnimation mInDownAnim; private Rotate3dAnimation mOutDownAnim; public AutoTextView(Context context) { this(context, null); } public AutoTextView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; mHandler = new Handler(mContext.getMainLooper()); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AutoTextView); mTextSize = a.getInt(R.styleable.AutoTextView_autoTextSize, 13); Log.e(TAG, "mTextSize: " + mTextSize); mTextColor = a.getColor(R.styleable.AutoTextView_autoTextColor, 0xFF999999); a.recycle(); setFactory(this); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mInDownAnim = createAnim(90, 0, h, w, true, false); mOutDownAnim = createAnim(0, -90, h, w, false, false); } private Rotate3dAnimation createAnim(float start, float end, float height, float width, boolean turnIn, boolean turnUp) { Rotate3dAnimation rotation = new Rotate3dAnimation(start, end, height, width, turnIn, turnUp); rotation.setDuration(1500); rotation.setFillAfter(false); rotation.setInterpolator(new AccelerateDecelerateInterpolator()); return rotation; } //这里返回的TextView,就是我们看到的View @Override public View makeView() { TextView textView = new TextView(mContext); textView.setGravity(Gravity.CENTER); textView.setTextSize(mTextSize); textView.setTextColor(mTextColor); textView.setSingleLine(true); return textView; } public String getUpText() { return mUpText; } public void setUpText(String upText) { mUpText = upText; } public String getDownText() { return mDownText; } public void setDownText(String downText) { mDownText = downText; } private boolean mIsRun = false; public void startAnim() { if (mIsRun) { return; } mIsRun = true; TimerTask animTask = new TimerTask() { @Override public void run() { mHandler.post(new Runnable() { @Override public void run() { if(TextUtils.isEmpty(mDownText) && TextUtils.isEmpty(mUpText)){ return; } setInAnimation(mInDownAnim); setOutAnimation(mOutDownAnim); if (mIsDown) { mIsDown = false; setText(mDownText); } else { mIsDown = true; setText(mUpText); } } }); } }; mAnimTimer = new Timer(); mAnimTimer.schedule(animTask, 0, 4000); } public void stopAnim() { if (mAnimTimer != null) { mAnimTimer.cancel(); mAnimTimer = null; } mIsRun = false; } private static class Rotate3dAnimation extends Animation { private final float mFromDegrees; private final float mToDegrees; private float mCenterX; private float mCenterY; private final boolean mTurnIn; private final boolean mTurnUp; private Camera mCamera; public Rotate3dAnimation(float fromDegrees, float toDegrees, float height, float width, boolean turnIn, boolean turnUp) { mFromDegrees = fromDegrees; mToDegrees = toDegrees; mCenterY = height / 2; mCenterX = width / 2; mTurnIn = turnIn; mTurnUp = turnUp; } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); mCamera = new Camera(); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { final float fromDegrees = mFromDegrees; float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime); final float centerX = mCenterX; final float centerY = mCenterY; final Camera camera = mCamera; final int derection = mTurnUp ? 1 : -1; final Matrix matrix = t.getMatrix(); camera.save(); if (mTurnIn) { camera.translate(0.0f, derection * mCenterY * (interpolatedTime - 1.0f), 0.0f); } else { camera.translate(0.0f, derection * mCenterY * (interpolatedTime), 0.0f); } camera.rotateX(degrees); camera.getMatrix(matrix); camera.restore(); matrix.preTranslate(-centerX, -centerY); matrix.postTranslate(centerX, centerY); } } }