package cn.androidy.thinking.views;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.DisplayMetrics;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Rick Meng on 2015/6/18.
*/
public class LyricManager {
private List<Lyric> mLyricList;
private Rect mTextBound = new Rect();
private DisplayMetrics dm;
private Lyric mCurrentLyric;
private float currentStartY;
private int mWidth;
private int mHeight;
private int mNormalColor;
private int mChangeColor;
private int mMaxTextWidth;
private Paint mPaint;
public LyricManager(List<String> textList, DisplayMetrics displayMetrics) {
mLyricList = new ArrayList<Lyric>();
dm = displayMetrics;
if (textList != null && !textList.isEmpty()) {
for (String s : textList) {
mLyricList.add(new Lyric(s));
}
}
}
public void confirmLyricState(int width, int height, int normalColor, int changeColor, int maxTextWidth, Paint paint) {
if (mLyricList != null && !mLyricList.isEmpty()) {
measureText(mLyricList.get(0).text, paint);
currentStartY = height / 2 - mTextBound.height() / 2;
confirmLyricState(width, height, normalColor, changeColor, maxTextWidth, paint, currentStartY);
}
}
public void confirmLyricState(int width, int height, int normalColor, int changeColor, int maxTextWidth, Paint paint, float startY) {
mWidth = width;
mHeight = height;
mNormalColor = normalColor;
mChangeColor = changeColor;
mMaxTextWidth = maxTextWidth;
mPaint = paint;
currentStartY = startY;
if (mLyricList != null && !mLyricList.isEmpty()) {
//将正在渲染的歌词居中处理。
measureText(mLyricList.get(0).text, paint);
float startProgress = 0;
float tempStartY = currentStartY;
for (Lyric lyric : mLyricList) {
String text = lyric.text;
measureText(text, paint);
int textWidth = Math.min(maxTextWidth, measureText(text, paint));
lyric.textWidth = textWidth;
lyric.startY = tempStartY += (mTextBound.height() * 1.5f);
lyric.startX = width / 2 - textWidth / 2;
lyric.color = normalColor;
lyric.colorChange = changeColor;
lyric.height = height;
lyric.startProgress = startProgress;
startProgress += lyric.calculateProgressArea(getTotalWidth());
}
}
}
private int measureText(String text, Paint paint) {
int w = (int) paint.measureText(text);
mTextBound = new Rect();
paint.getTextBounds(text, 0, text.length(), mTextBound);
return w;
}
public void dispatchDraw(Canvas canvas, Paint paint, float progress) {
if (mLyricList.isEmpty()) {
return;
}
for (Lyric lyric : mLyricList) {
boolean isCurrent = lyric.onDraw(canvas, paint, progress);
if (isCurrent) {
//如果换了一句歌词
if (mCurrentLyric != lyric) {
if(mCurrentLyric != null){
nextLyric();
}
mCurrentLyric = lyric;
}
}
}
}
//调整歌词整体上移一句
private void nextLyric() {
float targetStartY = currentStartY - (mTextBound.height() * 1.5f);
ValueAnimator animator = ValueAnimator.ofFloat(currentStartY, targetStartY).setDuration(1000);
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
confirmLyricState(mWidth, mHeight, mNormalColor, mChangeColor, mMaxTextWidth, mPaint, currentStartY);
currentStartY = (float) ((ValueAnimator) animation).getAnimatedValue();
}
});
animator.start();
}
private int getTotalWidth() {
if (mLyricList.isEmpty()) {
return 0;
}
int result = 0;
for (Lyric lyric : mLyricList) {
result += lyric.textWidth;
}
return result;
}
}