package me.wangyuwei.signuptransition;
import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;
/**
* 作者: 巴掌 on 16/8/19 09:00
* Github: https://github.com/JeasonWong
*/
public class LoginLoadingView extends View {
//正常状态
public static final int STATUS_LOGIN = 0;
//正在登录中
public static final int STATUS_LOGGING = 1;
//登录成功
public static final int STATUS_LOGIN_SUCCESS = 2;
private int mWidth, mHeight;
private Paint mPaint;
private int mDuration;
private int mStatus = STATUS_LOGIN;
//下方线条长度
private float mLineWidth;
//成功Text的x坐标
private float mSuccessTextX;
//成功Text的文案
private String mSuccessText = "SUCCESS";
//登录Text的文案
private String mLoginText = "SIGN UP";
//登录Text的alpha值
private int mLoginTextAlpha;
public LoginLoadingView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LoginLoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
mDuration = getResources().getInteger(R.integer.duration);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.WHITE);
mPaint.setTextSize(DensityUtil.sp2px(getContext(), 18));
mPaint.setStrokeWidth(DensityUtil.dp2px(getContext(), 3));
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
switch (mStatus) {
case STATUS_LOGIN:
canvas.drawText(mLoginText, (mWidth - getTextWidth(mLoginText)) / 2, (mHeight + getTextHeight(mLoginText)) / 2, mPaint);
break;
case STATUS_LOGGING:
canvas.drawText(mLoginText, (mWidth - getTextWidth(mLoginText)) / 2, (mHeight + getTextHeight(mLoginText)) / 2, mPaint);
canvas.drawLine((mWidth - getTextWidth(mLoginText)) / 2, mHeight, (mWidth - getTextWidth(mLoginText)) / 2 + mLineWidth, mHeight, mPaint);
break;
case STATUS_LOGIN_SUCCESS:
mPaint.setAlpha(mLoginTextAlpha);
canvas.drawText(mLoginText, mSuccessTextX + getTextWidth(mSuccessText) + DensityUtil.dp2px(getContext(), 10), (mHeight + getTextHeight(mLoginText)) / 2, mPaint);
mPaint.setAlpha(255 - mLoginTextAlpha);
canvas.drawText(mSuccessText, mSuccessTextX, (mHeight + getTextHeight(mSuccessText)) / 2, mPaint);
mPaint.setAlpha(255);
canvas.drawLine((mWidth - getTextWidth(mSuccessText)) / 2, mHeight, (mWidth + getTextWidth(mSuccessText)) / 2, mHeight, mPaint);
break;
}
}
/**
* 设置状态
*
* @param status 状态
*/
public void setStatus(int status) {
mStatus = status;
switch (status) {
case STATUS_LOGIN:
break;
case STATUS_LOGGING:
startLoggingAnim();
break;
case STATUS_LOGIN_SUCCESS:
startLoginSuccessAnim();
break;
}
}
/**
* 启动登录动画
*/
private void startLoggingAnim() {
ValueAnimator animator = ValueAnimator.ofFloat(0, getTextWidth(mLoginText));
animator.setDuration(1000);
animator.setRepeatCount(2);
animator.setRepeatMode(ValueAnimator.RESTART);
animator.setInterpolator(new LinearInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mLineWidth = (float) animation.getAnimatedValue();
invalidate();
}
});
animator.start();
}
/**
* 启动登录成功动画
*/
private void startLoginSuccessAnim() {
ValueAnimator textXAnim = ValueAnimator.ofFloat(0, (mWidth - getTextWidth(mSuccessText)) / 2);
textXAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mSuccessTextX = (float) animation.getAnimatedValue();
}
});
ValueAnimator alphaAnim = ValueAnimator.ofInt(255, 0);
alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mLoginTextAlpha = (int) animation.getAnimatedValue();
invalidate();
}
});
AnimatorSet set = new AnimatorSet();
set.playTogether(textXAnim, alphaAnim);
set.setDuration(mDuration);
set.setInterpolator(new LinearInterpolator());
set.start();
}
private float getTextHeight(String text) {
Rect rect = new Rect();
mPaint.getTextBounds(text, 0, text.length(), rect);
return rect.height();
}
private float getTextWidth(String text) {
return mPaint.measureText(text);
}
}