package com.example.ipcplayer.lyric; import java.util.ArrayList; import com.example.ipcplayer.activity.PlayingActivity; import com.example.ipcplayer.utils.LogUtil; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Align; import android.graphics.Paint.FontMetrics; import android.graphics.Rect; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; import android.view.ViewConfiguration; public class LyricView extends View { private final static String TAG = LyricView.class.getSimpleName(); private final static int FONT_TEXT_SIZE = 16; private final static int HIGH_LIGHT_FONT_TEXT_SIZE = 16; private final static int FONT_TEXT_VERTICAL_SPAC = 3; private final static int LYRIC_TEXT_VERTICAL_SPAC = 150; private Resources mResources; private DisplayMetrics mMetrics; private Paint mNormalPaint; private Paint mHighLightPaint; private Paint mDrawPaint; private ArrayList<LyricSentence> mLyricSentenceList = new ArrayList<LyricSentence>(); private boolean mIsLoadingLyric = false; private float mRowSpace;//歌词行间距 private float mCenterX; private float mCenterY; private float mFontHeight; private float mVisibleWidth;//歌词可见区域的宽度 private float mVisibleHeight;//歌词可见区域的高度 private FontMetrics mFontMetrics; private Rect mDirtyRect; @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); int what = msg.what; if (what == 0) { LogUtil.d(TAG + " handle msg"); invalidate(mDirtyRect); mHandler.sendEmptyMessageDelayed(0, 1000); } } }; public LyricView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public LyricView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public LyricView(Context context) { super(context); init(); } private void init(){ initView(); initPaint(); initFont(); } private void initView(){ mResources = getResources(); mMetrics = mResources.getDisplayMetrics(); } private void initPaint(){ mNormalPaint = new Paint(Paint.DITHER_FLAG); mNormalPaint.setAntiAlias(true); mNormalPaint.setColor(Color.WHITE); float normalTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, FONT_TEXT_SIZE, mMetrics); mNormalPaint.setTextSize(normalTextSize); mNormalPaint.setTextAlign(Align.CENTER); mHighLightPaint = new Paint(Paint.DITHER_FLAG); mHighLightPaint.setAntiAlias(true); mHighLightPaint.setColor(Color.BLUE); float highLightTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, HIGH_LIGHT_FONT_TEXT_SIZE, mMetrics); mHighLightPaint.setTextSize(highLightTextSize); mHighLightPaint.setTextAlign(Align.CENTER); mHighLightPaint.setFakeBoldText(true); mDrawPaint = new Paint(); changePaint(mNormalPaint); } private void initFont(){ // ViewConfiguration viewConfig = ViewConfiguration.get(getContext()); mRowSpace= TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, FONT_TEXT_VERTICAL_SPAC, mMetrics); mFontMetrics = mDrawPaint.getFontMetrics(); mFontHeight = mFontMetrics.top - mFontMetrics.bottom; //300 是预设的屏幕宽度 320-2*10 mVisibleWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, mMetrics); } private void changePaint(Paint paint){ mDrawPaint.reset(); mDrawPaint.set(paint); } public void updateLyric(int state){ switch(state){ case PlayingActivity.NO_LYRIC: break; case PlayingActivity.SEARCH_LYRIC: break; case PlayingActivity.LYRIC_READY: if (mHandler != null) { LogUtil.d(TAG + " lyric ready send msg"); mHandler.sendEmptyMessage(0); } break; } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); LogUtil.d(TAG + " draw lyric"); if(mIsLoadingLyric){ }else{ drawLyric(canvas); } } private void drawLyric(Canvas canvas){ LogUtil.d(TAG + " start draw lyric"); canvas.save(); canvas.translate(0, 0); float lineOffsetY = mRowSpace; LyricSentence sentence = new LyricSentence(); mLyricSentenceList = LyricGetter.get("try.lrc"); LogUtil.d(TAG + " get lyric sentence"); for(int dataIdx = 0; dataIdx < mLyricSentenceList.size(); dataIdx ++){ LogUtil.d(TAG + " get dataIdx= " + dataIdx); sentence = mLyricSentenceList.get(dataIdx); LogUtil.d(TAG + " get sentence= " + sentence.toString()); if(sentence == null) continue; String drawString = sentence.getSentence(); int index = 0 ; if(dataIdx != 0){ lineOffsetY += mFontHeight + mRowSpace; } if(isCenter(index)){ changePaint(mHighLightPaint); }else{ changePaint(mNormalPaint); } canvas.drawText(drawString, mCenterX, mCenterY + lineOffsetY, mDrawPaint); } canvas.restore(); } private boolean isCenter(int index){ return false; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); initDynamicSize(w,h); } private void initDynamicSize(int width, int height){ mCenterX = width >> 1; mCenterY = height >> 1; mVisibleWidth = width - getPaddingLeft() - getPaddingRight(); mVisibleHeight = height - getPaddingTop() - getPaddingBottom(); //handle dirtyRect mDirtyRect = new Rect((int)(mCenterX - mVisibleWidth / 2), (int)(mCenterY - mVisibleHeight / 2), (int)(mCenterX + mVisibleWidth / 2), (int)(mCenterY + mVisibleHeight / 2)); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); } @Override public void layout(int l, int t, int r, int b) { super.layout(l, t, r, b); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }