Commit 8f1f52f0 by 王佳洋

1,音视频悬浮窗代码优化

2,音频播放页逻辑修正
parent 91a4261a
...@@ -91,7 +91,7 @@ public class PlayFragment extends Fragment implements View.OnClickListener, ...@@ -91,7 +91,7 @@ public class PlayFragment extends Fragment implements View.OnClickListener,
} }
@Override @Override
public void onChange(Music music) { public void onLoad(Music music) {
onChangeImpl(music); onChangeImpl(music);
} }
......
...@@ -3,7 +3,6 @@ package com.yidianling.course.coursePlay ...@@ -3,7 +3,6 @@ package com.yidianling.course.coursePlay
import android.content.Intent import android.content.Intent
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.text.TextUtils import android.text.TextUtils
import android.util.Log
import android.view.ViewGroup import android.view.ViewGroup
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
...@@ -61,9 +60,9 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon ...@@ -61,9 +60,9 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon
private val ROUTER_PARAMS = "routerParam" private val ROUTER_PARAMS = "routerParam"
private var mCourseId = 0 // 课程id private var mCourseId = 0 // 课程id
private var receiverPlayUrl: String? = null // 外部选中要播放的音/视频文件地址 private var mReceiverPlayUrl: String? = null // 外部选中要播放的音/视频文件地址
private var isFromFloatView = false // 是否是悬浮窗进入 private var mIsFromFloatView = false // 是否是悬浮窗进入
private var from: Int = 0 private var mFrom: Int = 0
private var mCourPlayBean: CourseMediaDetailBean? = null private var mCourPlayBean: CourseMediaDetailBean? = null
private val mPlayList: ArrayList<CourseMediaBean> = ArrayList() // 播放列表 private val mPlayList: ArrayList<CourseMediaBean> = ArrayList() // 播放列表
private var mCourseSpeedDialog: CourseSpeedDialog? = null private var mCourseSpeedDialog: CourseSpeedDialog? = null
...@@ -113,20 +112,20 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon ...@@ -113,20 +112,20 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon
} }
//正常跳转所传参数 //正常跳转所传参数
mCourseId = it.getIntExtra("course_id", 0) mCourseId = it.getIntExtra("course_id", 0)
receiverPlayUrl = it.getStringExtra("coursePlayUrl") mReceiverPlayUrl = it.getStringExtra("coursePlayUrl")
isFromFloatView = it.getBooleanExtra("isFromFloatView", false) mIsFromFloatView = it.getBooleanExtra("isFromFloatView", false)
if (!TextUtils.isEmpty(receiverPlayUrl) && isFromFloatView) if (!TextUtils.isEmpty(mReceiverPlayUrl) && mIsFromFloatView)
audio_play.mNonWifiTips = false audio_play.mNonWifiTips = false
try { try {
if (PlayerFloatHelper.playingType == PlayTypeEnum.PLAY_TYPE_COURSE if (PlayerFloatHelper.playingType == PlayTypeEnum.PLAY_TYPE_COURSE
&& AudioPlayer.get().isPlaying && audio_play.isPlaying()
&& TextUtils.isEmpty(receiverPlayUrl) && TextUtils.isEmpty(mReceiverPlayUrl)
) { ) {
receiverPlayUrl = AudioPlayer.get().playMusic?.path mReceiverPlayUrl = audio_play.getAudioMusic()?.path
} }
} catch (e: Exception) { } catch (e: Exception) {
} }
from = it.getIntExtra("from", 0) mFrom = it.getIntExtra("from", 0)
if (mCourseId == 0) { if (mCourseId == 0) {
ToastUtil.toastShort("参数错误") ToastUtil.toastShort("参数错误")
finish() finish()
...@@ -179,11 +178,9 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon ...@@ -179,11 +178,9 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon
} }
private fun togglePlaying(playPosition: Int) { private fun togglePlaying(playPosition: Int) {
Log.d("wjy====", "mCurrentPosition -> $mCurrentPosition index -> $playPosition")
if (playPosition >= mPlayList.size || playPosition < 0) { if (playPosition >= mPlayList.size || playPosition < 0) {
ToastUtil.toastShort("暂无内容") ToastUtil.toastShort("暂无内容")
} else if (mCurrentPosition != playPosition) { } else if (mCurrentPosition != playPosition) {
Log.d("wjy====", "audio_play.play")
mCurrentPosition = playPosition mCurrentPosition = playPosition
mCourPlayBean?.courseExtra?.let { mCourPlayBean?.courseExtra?.let {
if (isCanPlay(it.isBuy)) audio_play.play(mCurrentPosition) if (isCanPlay(it.isBuy)) audio_play.play(mCurrentPosition)
...@@ -194,7 +191,7 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon ...@@ -194,7 +191,7 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon
private fun isCanPlay(isBuy: Boolean): Boolean { private fun isCanPlay(isBuy: Boolean): Boolean {
mPlayList.elementAtOrNull(mCurrentPosition)?.let { mPlayList.elementAtOrNull(mCurrentPosition)?.let {
if (!it.isDemo && !isBuy) { if (!it.isDemo && !isBuy) {
if (AudioPlayer.get().isPlaying) AudioPlayer.get().pausePlayer() if (audio_play.isPlaying()) audio_play.pausePlay()
buyCourseTipDialog() buyCourseTipDialog()
} else if (it.mediaType == COURSE_AUDIO) { } else if (it.mediaType == COURSE_AUDIO) {
return true return true
...@@ -221,9 +218,9 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon ...@@ -221,9 +218,9 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon
} }
private fun showFloatView(): Boolean { private fun showFloatView(): Boolean {
if (AudioPlayer.get().isPlaying && PlayerFloatHelper.playingType == PlayTypeEnum.PLAY_TYPE_COURSE) { if (audio_play.isPlaying() && PlayerFloatHelper.playingType == PlayTypeEnum.PLAY_TYPE_COURSE) {
AudioPlayer.get().playMusic?.coverPath = mCourPlayBean?.courseExtra?.pic audio_play.getAudioMusic()?.coverPath = mCourPlayBean?.courseExtra?.pic
AudioPlayer.get().playMusic?.artist = mCourPlayBean?.courseExtra?.doctorName audio_play.getAudioMusic()?.artist = mCourPlayBean?.courseExtra?.doctorName
PlayerFloatHelper.playTempData.clear() PlayerFloatHelper.playTempData.clear()
...@@ -276,10 +273,10 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon ...@@ -276,10 +273,10 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon
mCourPlayBean = bean mCourPlayBean = bean
mPlayList.clear() mPlayList.clear()
setPlayList(bean) setPlayList(bean)
if (!TextUtils.isEmpty(receiverPlayUrl)) { if (!TextUtils.isEmpty(mReceiverPlayUrl)) {
mCurrentPosition = mPlayList.indexOfLast { mCurrentPosition = mPlayList.indexOfLast {
TextUtils.equals(receiverPlayUrl, it.url) || TextUtils.equals( TextUtils.equals(mReceiverPlayUrl, it.url) || TextUtils.equals(
receiverPlayUrl!!.replace( mReceiverPlayUrl!!.replace(
"http", "http",
"https" "https"
), it.url ), it.url
...@@ -312,7 +309,7 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon ...@@ -312,7 +309,7 @@ class AudioPlayActivity : BaseMvpActivity<IAudioPlayContract.View, IAudioPlayCon
tv_list.setOnClickListener { listClick() } tv_list.setOnClickListener { listClick() }
iv_list.setOnClickListener { listClick() } iv_list.setOnClickListener { listClick() }
} }
audio_play.setData(mCurrentPosition, convertToMusics(mPlayList), bean.courseExtra.isBuy, from) audio_play.setData(mCurrentPosition, convertToMusics(mPlayList), bean.courseExtra.isBuy, mFrom)
} }
private fun convertToMusics(list: List<CourseMediaBean>): ArrayList<Music> { private fun convertToMusics(list: List<CourseMediaBean>): ArrayList<Music> {
......
...@@ -62,11 +62,13 @@ class CourseServiceImp : ICourseService { ...@@ -62,11 +62,13 @@ class CourseServiceImp : ICourseService {
} }
override fun startCoursePlayActivity(activity: Activity, courseId: Int, coursePlayUrl: String?, from: Int, mediaType: String?) { override fun startCoursePlayActivity(activity: Activity, courseId: Int, coursePlayUrl: String?, from: Int, mediaType: String?) {
val intent = if (COURSE_AUDIO.toString() == mediaType) { // val intent = if (COURSE_AUDIO.toString() == mediaType) {
Intent(activity, AudioPlayActivity::class.java) // Intent(activity, AudioPlayActivity::class.java)
} else { // } else {
Intent(activity, CoursePlayActivity::class.java) // Intent(activity, CoursePlayActivity::class.java)
} // }
val intent = Intent(activity, AudioPlayActivity::class.java)
intent.putExtra("course_id", courseId) intent.putExtra("course_id", courseId)
intent.putExtra("coursePlayUrl", coursePlayUrl) intent.putExtra("coursePlayUrl", coursePlayUrl)
intent.putExtra("from", from) intent.putExtra("from", from)
......
package com.yidianling.course.widget package com.yidianling.course.widget
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.text.TextUtils import android.text.TextUtils
import android.util.AttributeSet import android.util.AttributeSet
import android.util.Log
import android.view.View import android.view.View
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.SeekBar import android.widget.SeekBar
...@@ -81,7 +83,7 @@ class AudioPlayView(context: Context, attrs: AttributeSet?) : ...@@ -81,7 +83,7 @@ class AudioPlayView(context: Context, attrs: AttributeSet?) :
if (playList.isEmpty()) return if (playList.isEmpty()) return
setAutoNext(isAuto) setAutoNext(isAuto)
AudioPlayer.get().addPlayList(playList) AudioPlayer.get().addPlayList(playList)
if (AudioPlayer.get().isPlaying) mNonWifiTips = false if (isPlaying()) mNonWifiTips = false
if (RxNetTool.isWifi(context)) { if (RxNetTool.isWifi(context)) {
playAudio(from, playPosition, playList) playAudio(from, playPosition, playList)
} else { } else {
...@@ -101,9 +103,10 @@ class AudioPlayView(context: Context, attrs: AttributeSet?) : ...@@ -101,9 +103,10 @@ class AudioPlayView(context: Context, attrs: AttributeSet?) :
} }
private fun playAudio(from: Int, playPosition: Int, playList: ArrayList<Music>) { private fun playAudio(from: Int, playPosition: Int, playList: ArrayList<Music>) {
if (AudioPlayer.get().isPlaying && (from == 1 || from == 2)) { if (isPlaying() && (from == 1 || from == 2)) {
if (TextUtils.equals(getCurrentUrl(), playList[playPosition].path)) { if (TextUtils.equals(getCurrentUrl(), playList[playPosition].path)) {
updateView(playPosition) seekbar.max = AudioPlayer.get().getDuration().toInt()
tv_duration.text = getStringTime(seekbar.max)
} else { } else {
play(playPosition) play(playPosition)
} }
...@@ -112,16 +115,6 @@ class AudioPlayView(context: Context, attrs: AttributeSet?) : ...@@ -112,16 +115,6 @@ class AudioPlayView(context: Context, attrs: AttributeSet?) :
} }
} }
private fun updateView(playPosition: Int) {
if (AudioPlayer.get().isPlaying) {
seekbar.max = AudioPlayer.get().getDuration().toInt()
tv_end.text = getStringTime(seekbar.max)
if (AudioPlayer.get().isPlaying) {
displayPlayStatus(R.drawable.course_pause)
}
}
}
/** /**
* 获取当前播放url * 获取当前播放url
*/ */
...@@ -131,10 +124,7 @@ class AudioPlayView(context: Context, attrs: AttributeSet?) : ...@@ -131,10 +124,7 @@ class AudioPlayView(context: Context, attrs: AttributeSet?) :
fun play(index: Int) { fun play(index: Int) {
PlayerFloatHelper.playingType = PlayTypeEnum.PLAY_TYPE_COURSE PlayerFloatHelper.playingType = PlayTypeEnum.PLAY_TYPE_COURSE
AudioPlayer.get().play(index) AudioPlayer.get().load(index)
if (AudioPlayer.get().isPlaying) {
displayPlayStatus(R.drawable.course_pause)
}
} }
/** /**
...@@ -148,47 +138,41 @@ class AudioPlayView(context: Context, attrs: AttributeSet?) : ...@@ -148,47 +138,41 @@ class AudioPlayView(context: Context, attrs: AttributeSet?) :
} }
} }
@SuppressLint("SetTextI18n")
override fun onChange(music: Music) { override fun onLoad(music: Music) {
displayPlayStatus(R.drawable.course_loading5, true) displayPlayStatus(R.drawable.course_loading5, true)
seekbar.progress = 0 seekbar.progress = 0
tv_start.text = "00:00" tv_start.text = "00:00"
} }
override fun onPlayerStart() { override fun onPlayerStart() {
displayPlayStatus(R.drawable.course_pause)
} }
override fun onPlayerPause() { override fun onPrepared(duration: Long) {
if (AudioPlayer.get().isPlaying) { seekbar.max = duration.toInt()
displayPlayStatus(R.drawable.course_pause) tv_duration.text = getStringTime(seekbar.max)
} else { mListener?.invoke(AudioPlayer.get().playPosition)
displayPlayStatus(R.drawable.course_play) }
}
override fun onBufferingUpdate(percent: Int) {
seekbar.secondaryProgress = percent * seekbar.max / 100
} }
override fun onPublish(percent: Int, currentPosition: Long) { override fun onPublish(percent: Int, currentPosition: Long) {
if (!mSeekBarIsTouch) { if (!mSeekBarIsTouch) {
displayPlayStatus(R.drawable.course_pause)
seekbar.progress = currentPosition.toInt() seekbar.progress = currentPosition.toInt()
tv_start.text = getStringTime(currentPosition.toInt()) tv_start.text = getStringTime(currentPosition.toInt())
} }
} }
override fun onBufferingUpdate(percent: Int) { override fun onComplete() {
if (!AudioPlayer.get().isPlaying) {
displayPlayStatus(R.drawable.course_loading5, true)
}
seekbar.secondaryProgress = percent * seekbar.max / 100
}
override fun onPrepared(duration: Long) {
seekbar.max = duration.toInt()
tv_end.text = getStringTime(seekbar.max)
mListener?.invoke(AudioPlayer.get().playPosition)
} }
override fun onComplete() { override fun onPlayerPause() {
if (AudioPlayer.get().isPlaying) { if (isPlaying()) {
displayPlayStatus(R.drawable.course_pause)
} else {
displayPlayStatus(R.drawable.course_play) displayPlayStatus(R.drawable.course_play)
} }
} }
...@@ -230,4 +214,10 @@ class AudioPlayView(context: Context, attrs: AttributeSet?) : ...@@ -230,4 +214,10 @@ class AudioPlayView(context: Context, attrs: AttributeSet?) :
AudioPlayer.get().setSpeed(speed) AudioPlayer.get().setSpeed(speed)
} }
fun isPlaying() = AudioPlayer.get().isPlaying
fun pausePlay() = AudioPlayer.get().pausePlayer()
fun getAudioMusic() = AudioPlayer.get().playMusic
} }
\ No newline at end of file
...@@ -117,7 +117,7 @@ class HPlayView : RelativeLayout, OnPlayerEventListener { ...@@ -117,7 +117,7 @@ class HPlayView : RelativeLayout, OnPlayerEventListener {
fun play(index: Int) { fun play(index: Int) {
PlayerFloatHelper.playingType = PlayTypeEnum.PLAY_TYPE_COURSE PlayerFloatHelper.playingType = PlayTypeEnum.PLAY_TYPE_COURSE
AudioPlayer.get().play(index) AudioPlayer.get().load(index)
updateButton() updateButton()
} }
...@@ -140,7 +140,7 @@ class HPlayView : RelativeLayout, OnPlayerEventListener { ...@@ -140,7 +140,7 @@ class HPlayView : RelativeLayout, OnPlayerEventListener {
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun onChange(music: Music) { override fun onLoad(music: Music) {
if (mContext != null) { if (mContext != null) {
displayImage(com.yidianling.course.R.drawable.course_loading5,img_gif,true) displayImage(com.yidianling.course.R.drawable.course_loading5,img_gif,true)
} }
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<clip> <clip>
<shape> <shape>
<corners android:radius="3dp" /> <corners android:radius="3dp" />
<solid android:color="#ECF0F1" /> <solid android:color="@color/color_FAFAFF" />
</shape> </shape>
</clip> </clip>
</item> </item>
......
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="375dp"
android:height="90dp"
android:viewportWidth="375"
android:viewportHeight="90">
<path
android:pathData="M0,0h375v90h-375z"
android:strokeWidth="1"
android:fillType="evenOdd"
android:strokeColor="#00000000">
<aapt:attr name="android:fillColor">
<gradient
android:startY="0"
android:startX="187.5"
android:endY="90"
android:endX="187.5"
android:type="linear">
<item android:offset="0" android:color="#C7FFFFFF"/>
<item android:offset="0.45317963" android:color="#FFFFFFFF"/>
<item android:offset="1" android:color="#FFFFFFFF"/>
</gradient>
</aapt:attr>
</path>
</vector>
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
android:minHeight="3dp" android:minHeight="3dp"
android:progressDrawable="@drawable/course_seekbar" android:progressDrawable="@drawable/course_seekbar"
android:thumb="@drawable/course_seekbar_dot" android:thumb="@drawable/course_seekbar_dot"
tools:progress="0" /> android:progress="0" />
<TextView <TextView
android:id="@+id/tv_start" android:id="@+id/tv_start"
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
android:textColor="@android:color/white"/> android:textColor="@android:color/white"/>
<TextView <TextView
android:id="@+id/tv_end" android:id="@+id/tv_duration"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
tools:text="00:00" tools:text="00:00"
......
...@@ -26,11 +26,4 @@ ...@@ -26,11 +26,4 @@
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintTop_toBottomOf="@id/tv_title" /> app:layout_constraintTop_toBottomOf="@id/tv_title" />
<View
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="@drawable/mask"
app:layout_constraintBottom_toBottomOf="@id/recycler_list" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -591,7 +591,7 @@ public class FMDetailActivity extends BaseActivity implements View.OnClickListen ...@@ -591,7 +591,7 @@ public class FMDetailActivity extends BaseActivity implements View.OnClickListen
} }
@Override @Override
public void onChange(@NotNull Music music) { public void onLoad(@NotNull Music music) {
} }
......
...@@ -292,7 +292,7 @@ class MeditationFloatWindow(var mContext: Context) : FrameLayout(mContext) { ...@@ -292,7 +292,7 @@ class MeditationFloatWindow(var mContext: Context) : FrameLayout(mContext) {
myHandler?.sendEmptyMessage(UPDATE_VIEW_COMPLETE) myHandler?.sendEmptyMessage(UPDATE_VIEW_COMPLETE)
} }
override fun onChange(music: Music) { override fun onLoad(music: Music) {
} }
override fun onPlayerStart() { override fun onPlayerStart() {
......
...@@ -122,17 +122,14 @@ class AudioPlayer private constructor() { ...@@ -122,17 +122,14 @@ class AudioPlayer private constructor() {
fun init(context: Context) { fun init(context: Context) {
this.context = context.applicationContext this.context = context.applicationContext
audioFocusManager = AudioFocusManager(context) audioFocusManager = AudioFocusManager(context)
mediaPlayer = IjkMediaPlayer()
try { try {
(mediaPlayer as IjkMediaPlayer).setOption( mediaPlayer = IjkMediaPlayer().also {
IjkMediaPlayer.OPT_CATEGORY_FORMAT, it.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1)
"dns_cache_clear", it.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1)
1 }
)
} catch (e: Exception) { } catch (e: Exception) {
LogUtil.e(e.message) LogUtil.e(e.message)
} }
mediaPlayer!!.setOnPreparedListener { mediaPlayer!!.setOnPreparedListener {
if (isPreparing) { if (isPreparing) {
if (autoSaveProgress) { if (autoSaveProgress) {
...@@ -217,7 +214,7 @@ class AudioPlayer private constructor() { ...@@ -217,7 +214,7 @@ class AudioPlayer private constructor() {
musicList.add(music) musicList.add(music)
playMode = PlayModeEnum.SINGLE playMode = PlayModeEnum.SINGLE
autoSaveProgress = isAutoSaveProgress autoSaveProgress = isAutoSaveProgress
play(0) load(0)
} }
/** /**
...@@ -228,7 +225,7 @@ class AudioPlayer private constructor() { ...@@ -228,7 +225,7 @@ class AudioPlayer private constructor() {
musicList.add(music) musicList.add(music)
playMode = PlayModeEnum.SINGLE_LOOP playMode = PlayModeEnum.SINGLE_LOOP
autoSaveProgress = false autoSaveProgress = false
play(0) load(0)
} }
/** /**
...@@ -240,20 +237,20 @@ class AudioPlayer private constructor() { ...@@ -240,20 +237,20 @@ class AudioPlayer private constructor() {
musicList.add(music) musicList.add(music)
position = musicList.size - 1 position = musicList.size - 1
} }
play(position) load(position)
} }
/** /**
* 播放第一首 * 播放第一首
*/ */
fun play() { fun play() {
play(0) load(0)
} }
/** /**
* 加载指定索引的音乐 * 加载指定索引的音乐
*/ */
fun play(index: Int) { fun load(index: Int) {
var position = index var position = index
if (musicList.isEmpty()) { if (musicList.isEmpty()) {
return return
...@@ -275,7 +272,7 @@ class AudioPlayer private constructor() { ...@@ -275,7 +272,7 @@ class AudioPlayer private constructor() {
mediaPlayer!!.prepareAsync() mediaPlayer!!.prepareAsync()
state = STATE_PREPARING state = STATE_PREPARING
for (listener in listeners) { for (listener in listeners) {
listener.onChange(music) listener.onLoad(music)
} }
if (isShowNotify) { if (isShowNotify) {
NotifyManager.get().showPlay(music) NotifyManager.get().showPlay(music)
...@@ -303,7 +300,7 @@ class AudioPlayer private constructor() { ...@@ -303,7 +300,7 @@ class AudioPlayer private constructor() {
} else { } else {
stopPlayer() stopPlayer()
for (listener in listeners) { for (listener in listeners) {
listener.onChange(playMusic!!) listener.onLoad(playMusic!!)
} }
} }
} }
...@@ -324,7 +321,7 @@ class AudioPlayer private constructor() { ...@@ -324,7 +321,7 @@ class AudioPlayer private constructor() {
startPlayer() startPlayer()
} }
else -> { else -> {
play(playPosition) load(playPosition)
} }
} }
} }
...@@ -408,7 +405,7 @@ class AudioPlayer private constructor() { ...@@ -408,7 +405,7 @@ class AudioPlayer private constructor() {
PlayModeEnum.LIST_LOOP -> playPosition + 1 PlayModeEnum.LIST_LOOP -> playPosition + 1
else -> playPosition + 1 else -> playPosition + 1
} }
play(position) load(position)
} }
/** /**
...@@ -424,7 +421,7 @@ class AudioPlayer private constructor() { ...@@ -424,7 +421,7 @@ class AudioPlayer private constructor() {
PlayModeEnum.LIST_LOOP -> playPosition - 1 PlayModeEnum.LIST_LOOP -> playPosition - 1
else -> playPosition - 1 else -> playPosition - 1
} }
play(playPosition) load(playPosition)
} }
/** /**
...@@ -434,20 +431,24 @@ class AudioPlayer private constructor() { ...@@ -434,20 +431,24 @@ class AudioPlayer private constructor() {
*/ */
fun seekTo(percent: Int = -1, position: Long = -1) { fun seekTo(percent: Int = -1, position: Long = -1) {
if (isPlaying || isPausing) { if (isPlaying || isPausing) {
val duration = getDuration()
var currentPosition = 0L
var currentPercent = 0 var currentPercent = 0
val currentPosition = if (position != -1L) {
if (position != (-1).toLong()) { val pos = when {
val current = (currentPosition * 1.0).toFloat() position > duration -> duration
val du = mediaPlayer!!.duration.toFloat() position < 0 -> 0L
currentPercent = (current * 100 / du).toInt() else -> position
}
currentPosition = position currentPercent = (pos / duration).toInt()
pos
} else { } else {
currentPosition = percent * mediaPlayer!!.duration / 100 currentPercent = when {
percent > 100 -> 100
percent < 0 -> 0
else -> percent
}
currentPercent * duration / 100
} }
mediaPlayer!!.seekTo(currentPosition) mediaPlayer!!.seekTo(currentPosition)
MediaSessionManager.get().updatePlaybackState() MediaSessionManager.get().updatePlaybackState()
if (autoSaveProgress) { if (autoSaveProgress) {
......
...@@ -10,26 +10,21 @@ import com.ydl.media.audio.model.Music ...@@ -10,26 +10,21 @@ import com.ydl.media.audio.model.Music
interface OnPlayerEventListener { interface OnPlayerEventListener {
/** /**
* 切换歌曲 * 加载歌曲
*/ */
fun onChange(music: Music) fun onLoad(music: Music)
/** /**
* 继续播放 * 开始播放
*/ */
fun onPlayerStart() fun onPlayerStart()
/** /**
* 暂停播放 * 准备完成
*/ *
fun onPlayerPause() * duration:音乐时长
/**
* 更新进度
* percent : 播放百分比
* currentPosition:当前播放位置
*/ */
fun onPublish(percent: Int,currentPosition: Long) fun onPrepared(duration:Long)
/** /**
* 缓冲百分比 * 缓冲百分比
...@@ -37,14 +32,19 @@ interface OnPlayerEventListener { ...@@ -37,14 +32,19 @@ interface OnPlayerEventListener {
fun onBufferingUpdate(percent: Int) fun onBufferingUpdate(percent: Int)
/** /**
* 准备完成 * 更新进度
* * percent : 播放百分比
* duration:音乐时长 * currentPosition:当前播放位置
*/ */
fun onPrepared(duration:Long) fun onPublish(percent: Int,currentPosition: Long)
/** /**
* 单曲播放完成 * 单曲播放完成
*/ */
fun onComplete() fun onComplete()
/**
* 暂停播放
*/
fun onPlayerPause()
} }
...@@ -14,6 +14,7 @@ import com.ydl.media.audio.utils.CoverImageUtils ...@@ -14,6 +14,7 @@ import com.ydl.media.audio.utils.CoverImageUtils
/** /**
* Created by haorui on 2019-10-27 . * Created by haorui on 2019-10-27 .
* Des: * Des:
* 线控
*/ */
class MediaSessionManager private constructor() { class MediaSessionManager private constructor() {
......
...@@ -6,11 +6,11 @@ import android.content.Intent ...@@ -6,11 +6,11 @@ import android.content.Intent
import android.graphics.PixelFormat import android.graphics.PixelFormat
import android.graphics.Point import android.graphics.Point
import android.os.Bundle import android.os.Bundle
import androidx.core.view.ViewCompat
import android.text.TextUtils import android.text.TextUtils
import android.view.Gravity import android.view.Gravity
import android.view.View import android.view.View
import android.view.WindowManager import android.view.WindowManager
import androidx.core.view.ViewCompat
import com.alibaba.android.arouter.launcher.ARouter import com.alibaba.android.arouter.launcher.ARouter
import com.ydl.media.audio.AudioPlayer import com.ydl.media.audio.AudioPlayer
import com.yidianling.common.tools.RxImageTool import com.yidianling.common.tools.RxImageTool
...@@ -82,11 +82,11 @@ class PlayerFloatHelper { ...@@ -82,11 +82,11 @@ class PlayerFloatHelper {
} }
if (showingPageName != context::class.qualifiedName) { if (showingPageName != context::class.qualifiedName) {
mPlayerFloatView?.resetWm(context) mPlayerFloatView?.resetLayoutParams()
addFloatToWm(context) addFloatToWm(context)
} }
mPlayerFloatView?.resetView() mPlayerFloatView?.resetFloatView()
mPlayerFloatView?.visibility = View.VISIBLE mPlayerFloatView?.visibility = View.VISIBLE
mPlayerFloatView?.setPlayingState() mPlayerFloatView?.setPlayingState()
...@@ -153,7 +153,7 @@ class PlayerFloatHelper { ...@@ -153,7 +153,7 @@ class PlayerFloatHelper {
//获取WindowManager //获取WindowManager
wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
//设置LayoutParams(全局变量)相关参数 //设置LayoutParams(全局变量)相关参数
val wmParams = mPlayerFloatView?.wmParams val wmParams = mPlayerFloatView?.mFloatViewParams
wmParams?.type = WindowManager.LayoutParams.TYPE_APPLICATION //设置window type wmParams?.type = WindowManager.LayoutParams.TYPE_APPLICATION //设置window type
wmParams?.format = PixelFormat.RGBA_8888 //设置图片格式,效果为背景透明 wmParams?.format = PixelFormat.RGBA_8888 //设置图片格式,效果为背景透明
//设置Window flag //设置Window flag
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cl"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="56dp" android:layout_height="56dp"
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
...@@ -22,7 +23,6 @@ ...@@ -22,7 +23,6 @@
android:id="@+id/play_head" android:id="@+id/play_head"
android:layout_width="36dp" android:layout_width="36dp"
android:layout_height="36dp" android:layout_height="36dp"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp" android:layout_marginEnd="12dp"
android:src="@drawable/ico_play_float_pic" android:src="@drawable/ico_play_float_pic"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
...@@ -59,23 +59,30 @@ ...@@ -59,23 +59,30 @@
<TextView <TextView
android:id="@+id/tv_now_playing_time" android:id="@+id/tv_now_playing_time"
android:layout_width="0dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="@id/tv_title"
app:layout_constraintStart_toStartOf="@id/tv_title" app:layout_constraintStart_toStartOf="@id/tv_title"
android:ellipsize="end"
android:maxLines="1"
app:layout_constraintTop_toBottomOf="@id/tv_name" app:layout_constraintTop_toBottomOf="@id/tv_name"
android:textColor="#BFBFBF" android:textColor="#BFBFBF"
android:textSize="10sp" android:textSize="10sp"
tools:text="00:06" /> tools:text="00:06" />
<TextView
android:id="@+id/tv_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBaseline_toBaselineOf="@id/tv_now_playing_time"
app:layout_constraintStart_toEndOf="@id/tv_now_playing_time"
android:textColor="#BFBFBF"
android:textSize="10sp"
tools:text=" / 30:28" />
<ImageView <ImageView
android:id="@+id/play_state" android:id="@+id/play_state"
android:layout_width="30dp" android:layout_width="57dp"
android:layout_height="30dp" android:layout_height="30dp"
android:layout_marginStart="15dp" android:paddingStart="12dp"
android:layout_marginEnd="15dp" android:paddingEnd="15dp"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/ico_yyfc_play" android:src="@drawable/ico_yyfc_play"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"> <set xmlns:android="http://schemas.android.com/apk/res/android">
<translate <translate
android:duration="@android:integer/config_longAnimTime" android:duration="@android:integer/config_mediumAnimTime"
android:fromYDelta="0" android:fromYDelta="0"
android:toYDelta="100%p"/> android:toYDelta="100%p"/>
</set> </set>
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"> <set xmlns:android="http://schemas.android.com/apk/res/android">
<translate <translate
android:duration="@android:integer/config_longAnimTime" android:duration="@android:integer/config_mediumAnimTime"
android:fromYDelta="100%p" android:fromYDelta="100%p"
android:toYDelta="0"/> android:toYDelta="0"/>
</set> </set>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment