Skip to content

Commit

Permalink
本地歌词翻译;优化歌词时间轴;桌面歌词自定义字体颜色
Browse files Browse the repository at this point in the history
  • Loading branch information
rRemix committed Mar 12, 2019
1 parent 0437540 commit 5035ec3
Show file tree
Hide file tree
Showing 12 changed files with 284 additions and 46 deletions.
8 changes: 4 additions & 4 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,14 @@ android {
applicationId "remix.myplayer"
minSdkVersion 17
targetSdkVersion 26
versionCode 1502
versionName "1.5.0.2"
versionCode 1510
versionName "1.5.1.0"

flavorDimensions "default"
vectorDrawables.useSupportLibrary = true
ndk {
// abiFilters 'armeabi-v7a'
abiFilters 'armeabi-v7a', 'x86'
abiFilters 'armeabi-v7a'
// abiFilters 'armeabi-v7a', 'x86'
}
externalNativeBuild {
cmake {
Expand Down
29 changes: 27 additions & 2 deletions app/src/main/java/remix/myplayer/lyric/DefaultLrcParser.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package remix.myplayer.lyric

import android.os.Environment
import android.text.TextUtils
import android.util.Log
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import remix.myplayer.App
Expand All @@ -11,7 +10,7 @@ import remix.myplayer.misc.cache.DiskCache
import timber.log.Timber
import java.io.BufferedReader
import java.io.File
import java.util.*
import kotlin.collections.ArrayList

/**
* @ClassName
Expand Down Expand Up @@ -65,6 +64,7 @@ class DefaultLrcParser : ILrcParser {
}

override fun getLrcRows(bufferedReader: BufferedReader?, needCache: Boolean, cacheKey: String, searchKey: String): List<LrcRow>? {

//解析歌词
val lrcRows = ArrayList<LrcRow>()
val allLine = ArrayList<String>()
Expand Down Expand Up @@ -94,6 +94,30 @@ class DefaultLrcParser : ILrcParser {
lrcRows.addAll(rows)
}

//合并翻译
val combineLrcRows = ArrayList<LrcRow>()
var index = 0
while (index < lrcRows.size - 1){
//判断下一句歌词和当前歌词的时间是否一致,一致则认为下一句是当前歌词的翻译
val currentRow = lrcRows[index]
val nextRow = lrcRows[index + 1]
if(currentRow.time == nextRow.time){
val tmp = LrcRow()
tmp.content = currentRow.content
tmp.time = currentRow.time
tmp.timeStr = currentRow.timeStr
tmp.translate = nextRow.content
combineLrcRows.add(tmp)
index++
}
index++
}
if(combineLrcRows.size.toFloat() / lrcRows.size >= THRESHOLD_PROPORTION){
lrcRows.clear()
lrcRows.addAll(combineLrcRows)
}


if (lrcRows.size == 0)
return lrcRows
//为歌词排序
Expand All @@ -113,5 +137,6 @@ class DefaultLrcParser : ILrcParser {

companion object {
const val TAG = "DefaultLrcParser"
const val THRESHOLD_PROPORTION = 0.3
}
}
42 changes: 39 additions & 3 deletions app/src/main/java/remix/myplayer/lyric/LrcView.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.provider.CalendarContract.CalendarAlerts;
import android.support.annotation.ColorInt;
import android.support.annotation.StringRes;
import android.text.Layout;
Expand Down Expand Up @@ -282,14 +283,34 @@ protected void onDraw(Canvas canvas) {
* 分割绘制歌词
*/
private void drawLrcRow(Canvas canvas, TextPaint textPaint, int availableWidth, LrcRow lrcRow) {
drawText(canvas, textPaint, availableWidth, lrcRow.getContent());
if (lrcRow.hasTranslate()) {
// mRowY += DEFAULT_SPACING_PADDING;
drawText(canvas, textPaint, availableWidth, lrcRow.getTranslate());
drawTextWithTranslate(canvas, textPaint, availableWidth, lrcRow.getContent());
if (lrcRow.hasTranslate()) {
drawTextWithTranslate(canvas, textPaint, availableWidth, lrcRow.getTranslate());
}
} else {
drawText(canvas, textPaint, availableWidth, lrcRow.getContent());
}

mRowY += mLinePadding;
}

/**
* 分割绘制歌词
*/
private void drawTextTemp(Canvas canvas, TextPaint textPaint, int availableWidth, String text) {
StaticLayout staticLayout = new StaticLayout(text, textPaint, availableWidth,
Layout.Alignment.ALIGN_CENTER,
DEFAULT_SPACING_MULTI, 0, true);
final int extra = staticLayout.getLineCount() > 1 ? DensityUtil.dip2px(getContext(), 10) : 0;
canvas.save();
canvas.translate(getPaddingLeft(), mRowY - staticLayout.getHeight() / 2 + extra);
staticLayout.draw(canvas);
canvas.restore();
mRowY += staticLayout.getHeight();
}


/**
* 分割绘制歌词
*/
Expand All @@ -305,6 +326,21 @@ private void drawText(Canvas canvas, TextPaint textPaint, int availableWidth, St
mRowY += staticLayout.getHeight();
}

/**
* 分割绘制歌词
*/
private void drawTextWithTranslate(Canvas canvas, TextPaint textPaint, int availableWidth, String text) {
StaticLayout staticLayout = new StaticLayout(text, textPaint, availableWidth,
Layout.Alignment.ALIGN_CENTER,
DEFAULT_SPACING_MULTI, 0, true);
final int extra = staticLayout.getLineCount() > 1 ? DensityUtil.dip2px(getContext(), 10) : 0;
canvas.save();
canvas.translate(getPaddingLeft(), mRowY - staticLayout.getHeight() + extra);
staticLayout.draw(canvas);
canvas.restore();
mRowY += staticLayout.getHeight();
}

/**
* 是否可拖动歌词
**/
Expand Down
26 changes: 13 additions & 13 deletions app/src/main/java/remix/myplayer/service/MusicService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ class MusicService : BaseService(), Playback, MusicEventCallback {
/**
* 是否正在设置mediapplayer的datasource
*/
private var initialized = false
private var prepared = false

/**
* 数据是否加载完成
Expand Down Expand Up @@ -359,7 +359,7 @@ class MusicService : BaseService(), Playback, MusicEventCallback {
val progress: Int
get() {
try {
if (initialized) {
if (prepared) {
return mediaPlayer.currentPosition.toInt()
}
} catch (e: IllegalStateException) {
Expand All @@ -370,7 +370,7 @@ class MusicService : BaseService(), Playback, MusicEventCallback {
}

val duration: Long
get() = if (initialized) {
get() = if (prepared) {
mediaPlayer.duration
} else 0

Expand Down Expand Up @@ -612,7 +612,7 @@ class MusicService : BaseService(), Playback, MusicEventCallback {

mediaPlayer.setOnErrorListener { mp, what, extra ->
try {
initialized = false
prepared = false
mediaPlayer.release()
setUpPlayer()
ToastUtil.show(service, R.string.mediaplayer_error, what, extra)
Expand Down Expand Up @@ -685,7 +685,7 @@ class MusicService : BaseService(), Playback, MusicEventCallback {
}
mediaPlayer.release()
loadFinished = false
initialized = false
prepared = false
shortcutManager.updateContinueShortcut(this)

timer.cancel()
Expand Down Expand Up @@ -1444,7 +1444,7 @@ class MusicService : BaseService(), Playback, MusicEventCallback {
if (isPlaying) {
pause(true)
}
initialized = false
prepared = false
// openAudioEffectSession();

playbackHandler.post {
Expand All @@ -1458,10 +1458,10 @@ class MusicService : BaseService(), Playback, MusicEventCallback {
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0)
mediaPlayer.dataSource = path
mediaPlayer.prepareAsync()
initialized = true
prepared = true
} catch (e: Exception) {
ToastUtil.show(service, getString(R.string.play_failed) + e.toString())
initialized = false
prepared = false
}
}
}
Expand Down Expand Up @@ -1560,13 +1560,13 @@ class MusicService : BaseService(), Playback, MusicEventCallback {
* 设置MediaPlayer播放进度
*/
fun setProgress(current: Long) {
if (initialized) {
if (prepared) {
mediaPlayer.seekTo(current)
}
}

fun setSpeed(speed: Float) {
if (initialized) {
if (prepared) {
this.speed = speed
mediaPlayer.setSpeed(this.speed)
}
Expand Down Expand Up @@ -1979,7 +1979,7 @@ class MusicService : BaseService(), Playback, MusicEventCallback {
//获得AudioFocus
AudioManager.AUDIOFOCUS_GAIN -> {
audioFocus = true
if (!initialized) {
if (!prepared) {
setUpPlayer()
} else if (mNeedContinue) {
play(true)
Expand All @@ -1991,7 +1991,7 @@ class MusicService : BaseService(), Playback, MusicEventCallback {
//短暂暂停
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
mNeedContinue = isPlay
if (isPlay && initialized) {
if (isPlay && prepared) {
operation = Command.TOGGLE
pause(false)
}
Expand All @@ -2003,7 +2003,7 @@ class MusicService : BaseService(), Playback, MusicEventCallback {
//暂停
AudioManager.AUDIOFOCUS_LOSS -> {
audioFocus = false
if (isPlay && initialized) {
if (isPlay && prepared) {
operation = Command.TOGGLE
pause(false)
}
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/java/remix/myplayer/theme/ThemeStore.java
Original file line number Diff line number Diff line change
Expand Up @@ -233,8 +233,10 @@ public static int getDrawerDefaultColor() {

@ColorInt
public static int getFloatLyricTextColor() {
return SPUtil
final int temp = SPUtil
.getValue(App.getContext(), NAME, KEY_FLOAT_LYRIC_TEXT_COLOR, getMaterialPrimaryColor());

return ColorUtil.isColorCloseToWhite(temp) ? Color.parseColor("#F9F9F9") : temp;
}

public static void saveFloatLyricTextColor(@ColorInt int color) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
import remix.myplayer.util.ImageUriUtil;
import remix.myplayer.util.MediaStoreUtil;
import remix.myplayer.util.SPUtil;
import remix.myplayer.util.ToastUtil;

/**
* Created by Remix on 2015/12/4.
Expand Down Expand Up @@ -101,6 +102,10 @@ protected void onCreate(Bundle savedInstanceState) {
mId = getIntent().getIntExtra(EXTRA_ID, -1);
mType = getIntent().getIntExtra(EXTRA_TYPE, -1);
mArg = getIntent().getStringExtra(EXTRA_TITLE);
if(mId == -1 || mType == -1 || TextUtils.isEmpty(mArg)){
ToastUtil.show(this,R.string.illegal_arg);
finish();
}

mChoice = new MultipleChoice<>(this,
mType == Constants.PLAYLIST ? Constants.PLAYLISTSONG : Constants.SONG);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,9 @@ class SupportDevelopActivity : ToolbarActivity(), BillingProcessor.IBillingHandl
}

override fun onStart() {
mLoading.show()
if (hasWindowFocus()){
mLoading.show()
}
}
})
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ public DesktopLyricColorAdapter(Context Context, int layoutId, int width) {
/**
* 判断是否是选中的颜色
*/
private boolean isColorChoose(int color) {
return color == mCurrentColor;
private boolean isColorChoose(int colorRes) {
return mContext.getResources().getColor(colorRes) == mCurrentColor;
}

public void setCurrentColor(int color) {
Expand Down Expand Up @@ -85,9 +85,12 @@ public FloatColorHolder onCreateViewHolder(ViewGroup parent, int viewType) {

@Override
protected void convert(FloatColorHolder holder, Integer colorRes, final int position) {
final int color = ColorUtil.getColor(colorRes);
final int color = colorRes != R.color.md_white_primary ?
ColorUtil.getColor(colorRes) : Color.parseColor("#F9F9F9");

if (isColorChoose(colorRes)) {
holder.mColor.setBackground(new GradientDrawableMaker()
.shape(GradientDrawable.OVAL)
.color(color)
.strokeSize(DensityUtil.dip2px(1))
.strokeColor(Color.BLACK)
Expand Down
22 changes: 21 additions & 1 deletion app/src/main/java/remix/myplayer/ui/fragment/LyricFragment.kt
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package remix.myplayer.ui.fragment

import android.graphics.Color
import android.graphics.ColorFilter
import android.os.Bundle
import android.os.Message
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import butterknife.BindView
import butterknife.ButterKnife
import butterknife.OnClick
import io.reactivex.disposables.Disposable
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.fragment_lrc.*
import remix.myplayer.App
import remix.myplayer.R
import remix.myplayer.bean.mp3.Song
Expand All @@ -18,6 +22,8 @@ import remix.myplayer.lyric.LyricSearcher
import remix.myplayer.misc.handler.MsgHandler
import remix.myplayer.misc.handler.OnHandleMessage
import remix.myplayer.misc.interfaces.OnInflateFinishListener
import remix.myplayer.theme.ThemeStore
import remix.myplayer.theme.TintHelper
import remix.myplayer.ui.fragment.base.BaseMusicFragment
import remix.myplayer.util.SPUtil
import remix.myplayer.util.ToastUtil
Expand Down Expand Up @@ -59,9 +65,23 @@ class LyricFragment : BaseMusicFragment() {

onFindListener?.onViewInflateFinish(lrcView)


return rootView
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//黑色主题着色按钮
val themeRes = ThemeStore.getThemeRes()
if(themeRes == R.style.Theme_APlayer_Black || themeRes == R.style.Theme_APlayer_Dark){
iv_offset_reduce_arrow.setColorFilter(Color.WHITE)
iv_offset_reduce_second.setColorFilter(Color.WHITE)
offsetReset.setColorFilter(Color.WHITE)
iv_offset_add_arrow.setColorFilter(Color.WHITE)
iv_offset_add_second.setColorFilter(Color.WHITE)
}
}

override fun onDestroyView() {
msgHandler.remove()
disposable?.dispose()
Expand Down Expand Up @@ -94,7 +114,7 @@ class LyricFragment : BaseMusicFragment() {

disposable?.dispose()
disposable = lyricSearcher.setSong(info ?: return)
.getLyricObservable(manualPath,clearCache)
.getLyricObservable(manualPath, clearCache)
.doOnSubscribe { lrcView.setText(getStringSafely(R.string.searching)) }
.subscribe(Consumer {
if (id == info?.id) {
Expand Down
Loading

0 comments on commit 5035ec3

Please sign in to comment.