package cn.qylk.myview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; import android.util.AttributeSet; import android.widget.TextView; import cn.qylk.app.APP; public abstract class LrcViewBase extends TextView implements ILrcView { protected int cColor = APP.Config.lrccolor, ncColor = Color.WHITE; protected int centerX, centerY; protected Paint cPaint, ncPaint; protected float fp; protected int gap=0; protected int index; protected float len; protected LrcPackage lrcpac; protected int lTime, cTime, sTime; protected int nextpoint, offset; protected boolean shadow = APP.Config.lrcshadow; protected float TextSize=16.0f; protected Typeface Texttypeface = Typeface.DEFAULT; public LrcViewBase(Context context) { this(context, null, 0); } public LrcViewBase(Context context, AttributeSet attrs) { this(context, attrs, 0); } public LrcViewBase(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public void clearView() { setText(""); lrcpac = null; } public LrcPackage GetLrcPackage() { return lrcpac; } public int GetOffset() { return offset; } protected void init() { setLrcTextSize(TextSize); ncPaint = new Paint();// 非高亮 部分 ncPaint.setAntiAlias(true); ncPaint.setTextAlign(Paint.Align.CENTER); ncPaint.setTextSize(TextSize); ncPaint.setColor(ncColor); ncPaint.setTypeface(Texttypeface); ncPaint.setShadowLayer(3, 2, -1, Color.BLACK); cPaint = new Paint();// 高亮部 分 当前歌 词 cPaint.setAntiAlias(true); cPaint.setTextAlign(Paint.Align.CENTER); cPaint.setTypeface(Texttypeface); cPaint.setTextSize(TextSize); cPaint.setColor(cColor); cPaint.setShadowLayer(3, 2, -1, Color.BLACK); } public void initLrcIndex(int curpos) { int i = 0; int sum = lrcpac.getSum(); while (i < sum) { if (curpos < lrcpac.list.get(i).beginTime) { break;// 查询到了索引,返回 } i++; } index = i - 1; updatedata(); updateView(curpos); } @Override protected abstract void onDraw(Canvas canvas); protected void OnNextLine() { index++; updatedata(); } @Override protected void onSizeChanged(int w, int h, int ow, int oh) { super.onSizeChanged(w, h, ow, oh); centerX = w >> 1;// 屏宽一半 centerY = h >> 1;// 屏高一半 } public void setFirstColor(int color) { cColor = color; cPaint.setColor(color); } @Override public void setGap(int gap) { this.gap = gap; } public void setLrcTextSize(float size) { float des = getResources().getDisplayMetrics().density; TextSize = size * des; } public void setLyric(LrcPackage lrc) { this.lrcpac = lrc; index = -1; offset = 0; } public void setOffset(int offset) { this.offset += offset; nextpoint = lrcpac.list.get(index + 1).beginTime + offset; } public void setSecondColor(int color) { ncPaint.setColor(color); } public void setShadow(boolean shadow) { this.shadow = shadow; if (!shadow) cPaint.setShader(null); } protected void updatedata() { if (index == -1) { nextpoint = lrcpac.list.get(0).beginTime + offset; return; } sTime = lrcpac.list.get(index).beginTime + offset;// 开始时间 if (index == lrcpac.getSum() - 1) { nextpoint = lrcpac.duration + 1500; lTime = lrcpac.duration - sTime; } else { nextpoint = lrcpac.list.get(index + 1).beginTime + offset;// 获取下一句时间起点 lTime = lrcpac.list.get(index).lineTime; } len = this.getTextSize() * lrcpac.list.get(index).lrcBody.length(); } public void updateView(int progress) { if (lrcpac == null) return; cTime = progress; if (nextpoint < progress) { OnNextLine(); } this.postInvalidate(); } }