添加自己的歌词依赖库LrcView

pull/1/head
jsyjst 6 years ago
parent 417e10a763
commit 14c85c581f

@ -65,6 +65,7 @@ dependencies {
implementation rootProject.ext.dependencies["ripple"] // implementation rootProject.ext.dependencies["ripple"] //
implementation rootProject.ext.dependencies["avi"] // implementation rootProject.ext.dependencies["avi"] //
implementation rootProject.ext.dependencies["speedDialog"] implementation rootProject.ext.dependencies["speedDialog"]
implementation rootProject.ext.dependencies["lrcView"]//

@ -38,6 +38,7 @@ import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.target.Target;
import com.bumptech.glide.request.transition.Transition; import com.bumptech.glide.request.transition.Transition;
import com.example.library.view.LrcView;
import com.example.musicplayer.R; import com.example.musicplayer.R;
import com.example.musicplayer.app.Api; import com.example.musicplayer.app.Api;
import com.example.musicplayer.app.Constant; import com.example.musicplayer.app.Constant;
@ -61,7 +62,6 @@ import com.example.musicplayer.util.MediaUtil;
import com.example.musicplayer.util.ScreenUtil; import com.example.musicplayer.util.ScreenUtil;
import com.example.musicplayer.widget.BackgroundAnimationRelativeLayout; import com.example.musicplayer.widget.BackgroundAnimationRelativeLayout;
import com.example.musicplayer.widget.DiscView; import com.example.musicplayer.widget.DiscView;
import com.example.musicplayer.widget.LrcView;
import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.Subscribe;
@ -636,10 +636,8 @@ public class PlayActivity extends BaseMvpActivity<PlayPresenter> implements IPla
public void showLrc(final String lrc) { public void showLrc(final String lrc) {
mDisc.setVisibility(View.GONE); mDisc.setVisibility(View.GONE);
mLrcView.setVisibility(View.VISIBLE); mLrcView.setVisibility(View.VISIBLE);
mLrcView.setLrc(lrc); Log.d(TAG, "showLrc: "+mPlayStatusBinder.getMediaPlayer().getCurrentPosition());
mLrcView.setHighLineColor(getResources().getColor(R.color.musicStyle)); mLrcView.setLrc(lrc).setPlayer(mPlayStatusBinder.getMediaPlayer()).draw();
mLrcView.setPlayer(mPlayStatusBinder.getMediaPlayer());
mLrcView.init();
} }

@ -1,192 +0,0 @@
package com.example.musicplayer.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.media.MediaPlayer;
import android.util.AttributeSet;
import android.view.View;
import com.example.musicplayer.R;
import com.example.musicplayer.entiy.LrcBean;
import com.example.musicplayer.util.LrcUtil;
import java.util.List;
/**
* <pre>
* author :
* time : 2019/03/18
* desc :
* </pre>
*/
public class LrcView extends View {
private List<LrcBean> list; //歌词列表
private Paint gPaint; //静态歌词画笔
private Paint hPaint; //动态歌词画笔
private int width = 0, height = 0;
private int currentPosition = 0; //歌曲播放的位置
private MediaPlayer player;
private int lastPosition = 0;
private int highLineColor; //播放歌词的颜色
private int lrcTextSize; //歌词大小
private int lrcColor; //歌词颜色
private int mode = 0;
public final static int KARAOKE = 1;
public void setHighLineColor(int highLineColor) {
this.highLineColor = highLineColor;
}
public void setLrcColor(int lrcColor) {
this.lrcColor = lrcColor;
}
public void setMode(int mode) {
this.mode = mode;
}
public void setPlayer(MediaPlayer player) {
this.player = player;
}
/**
* @param lrc
*/
public void setLrc(String lrc) {
list = LrcUtil.parseStr2List(lrc);
}
public LrcView(Context context) {
this(context, null);
}
public LrcView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LrcView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.LrcView);
highLineColor = ta.getColor(R.styleable.LrcView_hignLineColor, getResources().getColor(R.color.green));
lrcColor = ta.getColor(R.styleable.LrcView_lrcColor, getResources().getColor(android.R.color.darker_gray));
float densityText = getResources().getDisplayMetrics().scaledDensity;
lrcTextSize = ta.getDimensionPixelSize(R.styleable.LrcView_lrcTextSize,(int)(16*densityText));
mode = ta.getInt(R.styleable.LrcView_lrcMode,mode);
ta.recycle();
gPaint = new Paint();
gPaint.setAntiAlias(true);
gPaint.setColor(lrcColor);
gPaint.setTextSize(lrcTextSize);
gPaint.setTextAlign(Paint.Align.CENTER);
hPaint = new Paint();
hPaint.setAntiAlias(true);
hPaint.setColor(highLineColor);
hPaint.setTextSize(lrcTextSize);
hPaint.setTextAlign(Paint.Align.CENTER);
}
@Override
protected void onDraw(Canvas canvas) {
if (width == 0 || height == 0) {
width = getMeasuredWidth();
height = getMeasuredHeight();
}
if (list == null || list.size() == 0) {
canvas.drawText("暂无歌词", width / 2, height / 2, gPaint);
return;
}
getCurrentPosition();
int currentMillis = player.getCurrentPosition();
drawLrc2(canvas, currentMillis);
long start = list.get(currentPosition).getStart();
float v = (currentMillis - start) > 500 ? currentPosition * 120 : lastPosition * 120 + (currentPosition - lastPosition) * 120 * ((currentMillis - start) / 500f);
setScrollY((int) v);
if (getScrollY() == currentPosition * 120) {
lastPosition = currentPosition;
}
postInvalidateDelayed(100);
}
private void drawLrc2(Canvas canvas, int currentMillis) {
if (mode == 0) {
for (int i = 0; i < list.size(); i++) {
if (i == currentPosition) {
canvas.drawText(list.get(i).getLrc(), width / 2, height / 2 + 120 * i, hPaint);
} else {
canvas.drawText(list.get(i).getLrc(), width / 2, height / 2 + 120 * i, gPaint);
}
}
}else{
for (int i = 0; i < list.size(); i++) {
canvas.drawText(list.get(i).getLrc(), width / 2, height / 2 + 80 * i, gPaint);
}
String highLineLrc = list.get(currentPosition).getLrc();
int highLineWidth = (int) gPaint.measureText(highLineLrc);
int leftOffset = (width - highLineWidth) / 2;
LrcBean lrcBean = list.get(currentPosition);
long start = lrcBean.getStart();
long end = lrcBean.getEnd();
int i = (int) ((currentMillis - start) * 1.0f / (end - start) * highLineWidth);
if (i > 0) {
Bitmap textBitmap = Bitmap.createBitmap(i, 80, Bitmap.Config.ARGB_8888);
Canvas textCanvas = new Canvas(textBitmap);
textCanvas.drawText(highLineLrc, highLineWidth / 2, 80, hPaint);
canvas.drawBitmap(textBitmap, leftOffset, height / 2 + 80 * (currentPosition - 1), null);
}
}
}
public void init() {
currentPosition = 0;
lastPosition = 0;
setScrollY(0);
invalidate();
}
private void drawLrc1(Canvas canvas) {
String text = list.get(currentPosition).getLrc();
canvas.drawText(text, width / 2, height / 2, hPaint);
for (int i = 1; i < 10; i++) {
int index = currentPosition - i;
if (index > -1) {
canvas.drawText(list.get(index).getLrc(), width / 2, height / 2 - 100 * i, gPaint);
}
}
for (int i = 1; i < 10; i++) {
int index = currentPosition + i;
if (index < list.size()) {
canvas.drawText(list.get(index).getLrc(), width / 2, height / 2 + 100 * i, gPaint);
}
}
}
private void getCurrentPosition() {
try {
int currentMillis = player.getCurrentPosition();
if (currentMillis < list.get(0).getStart()) {
currentPosition = 0;
return;
}
if (currentMillis > list.get(list.size() - 1).getStart()) {
currentPosition = list.size() - 1;
return;
}
for (int i = 0; i < list.size(); i++) {
if (currentMillis >= list.get(i).getStart() && currentMillis < list.get(i).getEnd()) {
currentPosition = i;
return;
}
}
} catch (Exception e) {
postInvalidateDelayed(100);
}
}
}

@ -60,7 +60,7 @@
android:layout_below="@+id/relative_song" android:layout_below="@+id/relative_song"
android:background="#33ffffff" /> android:background="#33ffffff" />
<com.example.musicplayer.widget.LrcView <com.example.library.view.LrcView
android:id="@+id/lrcView" android:id="@+id/lrcView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -68,8 +68,8 @@
android:layout_marginBottom="@dimen/dp_40" android:layout_marginBottom="@dimen/dp_40"
android:layout_below="@+id/relative_song" android:layout_below="@+id/relative_song"
android:layout_above="@+id/downloadIv" android:layout_above="@+id/downloadIv"
app:lrcTextSize="18sp" app:textSize="@dimen/sp_18"
app:hignLineColor="@color/musicStyle" app:highLineTextColor="@color/musicStyle"
android:visibility="gone"/> android:visibility="gone"/>
<include <include

@ -6,14 +6,6 @@
<attr name="civ_border_overlay" format="boolean" /> <attr name="civ_border_overlay" format="boolean" />
<attr name="civ_fill_color" format="color" /> <attr name="civ_fill_color" format="color" />
</declare-styleable> </declare-styleable>
<declare-styleable name="LrcView">
<attr name="lrcMode" format="enum">
<enum name="KARAOKE" value="1"/>
</attr>
<attr name="hignLineColor" format="color|reference"/>
<attr name="lrcColor" format="color|reference"/>
<attr name="lrcTextSize" format="dimension"/>
</declare-styleable>
</resources> </resources>

@ -39,6 +39,7 @@ ext {
Avi : '2.1.3', Avi : '2.1.3',
Ripple : '1.3.1', Ripple : '1.3.1',
SpeedDialog : 'support-1.0.0', SpeedDialog : 'support-1.0.0',
LrcView : 'LrcView-1.1',
// //
LitePal : "3.0.0", LitePal : "3.0.0",
@ -80,6 +81,7 @@ ext {
ripple : "com.patrickpissurno:ripple-effect:${version.Ripple}", ripple : "com.patrickpissurno:ripple-effect:${version.Ripple}",
avi : "com.wang.avi:library:${version.Avi}", avi : "com.wang.avi:library:${version.Avi}",
speedDialog : "com.github.jsyjst:Yuan-SpeedDialog:${version.SpeedDialog}", speedDialog : "com.github.jsyjst:Yuan-SpeedDialog:${version.SpeedDialog}",
lrcView : "com.github.jsyjst:Yuan-LrcView:${version.LrcView}",
// //
litePal : "org.litepal.android:java:${version.LitePal}", litePal : "org.litepal.android:java:${version.LitePal}",

Loading…
Cancel
Save