package cn.androidy.thinking.views;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.view.animation.LinearInterpolator;
import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.ValueAnimator;
import java.util.ArrayList;
import java.util.List;
import cn.androidy.thinking.R;
/**
* Created by Rick Meng on 2015/6/18.
*/
public class LyricView extends View implements ValueAnimator.AnimatorUpdateListener, Animator.AnimatorListener {
private Paint mPaint;
private int mTextSize = sp2px(30);
private int mTextOriginColor = 0xff000000;
private int mTextChangeColor = 0xffff0000;
private int mMaxTextWidth;
private float mProgress;
private LyricManager lyricManager;
private ValueAnimator animator;
private boolean isPlaying = false;
public LyricView(Context context) {
super(context, null);
init(context, null);
}
public LyricView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
if (attrs != null) {
TypedArray ta = context.obtainStyledAttributes(attrs,
R.styleable.Lyric);
mTextSize = ta.getDimensionPixelSize(
R.styleable.Lyric_text_size, mTextSize);
mTextOriginColor = ta.getColor(
R.styleable.Lyric_text_origin_color,
mTextOriginColor);
mTextChangeColor = ta.getColor(
R.styleable.Lyric_text_change_color,
mTextChangeColor);
mProgress = ta.getFloat(R.styleable.Lyric_progress, 0);
ta.recycle();
}
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setTextSize(mTextSize);
List<String> list = new ArrayList<String>();
list.add("风吹雨成花");
list.add("时间追不上白马");
list.add("你年少掌心的梦话");
list.add("依然紧握着吗");
list.add("云翻涌成夏");
list.add(" 眼泪被岁月蒸发");
list.add("这条路上的你我她");
list.add(" 有谁迷路了吗");
lyricManager = new LyricManager(list, getResources().getDisplayMetrics());
}
public void startOrPause() {
if (isPlaying) {
animator.cancel();
isPlaying = false;
} else {
animator = ValueAnimator.ofFloat(mProgress, 1).setDuration((long) (10 * 1000 * (1 - mProgress)));
animator.setInterpolator(new LinearInterpolator());
animator.addUpdateListener(this);
animator.addListener(this);
animator.start();
}
}
//测试文字剪切
private String testClipRectText = "这段文字会被切成两半";
private int mTestTextStartX;
private int mTestTextWidth;
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getMeasuredWidth();
mMaxTextWidth = width - getPaddingLeft() - getPaddingRight();
mTestTextWidth = Math.min(mMaxTextWidth, measureText(testClipRectText, mPaint));
mTestTextStartX = mMaxTextWidth / 2 - mTestTextWidth / 2;
lyricManager.confirmLyricState(getMeasuredWidth(), getMeasuredHeight(), mTextOriginColor, mTextChangeColor, mMaxTextWidth, mPaint);
}
private int measureText(String text, Paint paint) {
int w = (int) paint.measureText(text);
return w;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
lyricManager.dispatchDraw(canvas, mPaint, mProgress);
mPaint.setColor(mTextOriginColor);
canvas.save(Canvas.CLIP_SAVE_FLAG);
int divPosition = mTestTextStartX + mTestTextWidth / 3;
canvas.clipRect(mTestTextStartX, 0, divPosition, getMeasuredHeight());
canvas.drawText(testClipRectText, mTestTextStartX, 120, mPaint);
canvas.restore();
mPaint.setColor(mTextChangeColor);
canvas.clipRect(divPosition, 0, mTestTextStartX + mTestTextWidth, getMeasuredHeight());
canvas.drawText(testClipRectText, mTestTextStartX, 240, mPaint);
canvas.restore();
}
private int sp2px(float dpVal) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
dpVal, getResources().getDisplayMetrics());
}
@Override
public void onAnimationUpdate(ValueAnimator animation) {
LyricView.this.mProgress = (float) animation.getAnimatedValue();
invalidate();
}
@Override
public void onAnimationStart(Animator animation) {
isPlaying = true;
}
@Override
public void onAnimationEnd(Animator animation) {
isPlaying = false;
}
@Override
public void onAnimationCancel(Animator animation) {
isPlaying = false;
}
@Override
public void onAnimationRepeat(Animator animation) {
isPlaying = true;
}
}