package com.yidianling.course.widget import android.annotation.SuppressLint import android.app.Activity import android.os.Build import android.os.Handler import androidx.annotation.DrawableRes import androidx.annotation.Nullable import androidx.annotation.RawRes import android.view.View import android.widget.ImageView import android.widget.RelativeLayout import android.widget.SeekBar import com.bumptech.glide.Glide import com.ydl.media.audio.AudioPlayer import com.ydl.media.audio.OnPlayerEventListener import com.ydl.media.audio.enums.PlayModeEnum import com.ydl.media.audio.model.Music import com.ydl.media.view.PlayTypeEnum import com.ydl.media.view.PlayerFloatHelper import com.yidianling.course.listener.HPlayStatusListener import kotlinx.android.synthetic.main.course_play_music_view.view.* /** * Created by hgw on 2018/4/28. */ class HPlayView : RelativeLayout, OnPlayerEventListener { var mHandler: Handler? = null var listener: HPlayStatusListener? = null //seekBar 按下标记 var seekBarIsDown = false var progress = 0 var mContext: Activity? = null constructor(context1: Activity?) : super(context1) { this.mContext = context1 mHandler = Handler() init() } fun init() { if (mContext == null) return View.inflate(context, com.yidianling.course.R.layout.course_play_music_view, this) AudioPlayer.get().addOnPlayEventListener(this) course_audio_play_icon.setOnClickListener { AudioPlayer.get().playPause() } img_gif.setOnClickListener { if (!AudioPlayer.get().isPlaying) { AudioPlayer.get().playPause() } } pro_progress.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) { if (p2) { text_start_time.text = getStringTime(p1) progress = p1 } } override fun onStartTrackingTouch(p0: SeekBar?) { seekBarIsDown = true } override fun onStopTrackingTouch(p0: SeekBar?) { seekBarIsDown = false //拖动seekbar时不进行以下操作 if (!seekBarIsDown) { AudioPlayer.get().seekTo(-1, progress.toLong()) } } }) } fun showNetNotice(event: () -> Unit) { ll_net_notice.visibility = View.VISIBLE img_gif.visibility = View.GONE iv_net_notice.setOnClickListener { hideNetNotice() event() } } fun hideNetNotice() { ll_net_notice.visibility = View.GONE img_gif.visibility = View.VISIBLE } fun setData(urlLi: ArrayList<Music>): HPlayView { AudioPlayer.get().addPlayList(urlLi) return this } fun updateView(index: Int) { if (AudioPlayer.get().isPlaying) { mHandler?.postDelayed({ pro_progress.max = AudioPlayer.get().getDuration().toInt() text_end_time.text = getStringTime(pro_progress.max) listener?.onPrepared(AudioPlayer.get().playMusic, index) }, 0) updateButton() } } /** * 获取当前播放url */ fun getCurrentUrl(): String { return AudioPlayer.get().playMusic?.path ?: "" } fun play(index: Int) { PlayerFloatHelper.playingType = PlayTypeEnum.PLAY_TYPE_COURSE AudioPlayer.get().play(index) updateButton() } fun setImageBackground(url: String?) { if (!isDestroy()){ mContext?.let { Glide.with(it).load(url).into(img_bg) } } } /** * 设置自动播放下一曲 */ fun setAutoNext(auto: Boolean) { if (!auto) { AudioPlayer.get().playMode = PlayModeEnum.SINGLE } else { AudioPlayer.get().playMode = PlayModeEnum.LIST_LOOP } } @SuppressLint("SetTextI18n") override fun onChange(music: Music) { if (mContext != null) { displayImage(com.yidianling.course.R.drawable.course_loading5,img_gif,true) } course_audio_play_icon.setImageResource(com.yidianling.course.R.drawable.course_ico_course_play) pro_progress.progress = 0 text_start_time.text = "00:00" } override fun onPlayerStart() { setGifVisibity(true) } override fun onPlayerPause() { if (AudioPlayer.get().isPlaying) { setGifVisibity(true) } else { setGifVisibity(false) } } override fun onPublish(percent: Int, currentPosition: Long) { if (!seekBarIsDown) { pro_progress.progress = currentPosition.toInt() text_start_time.text = getStringTime(currentPosition.toInt()) } } override fun onBufferingUpdate(percent: Int) { showBufferLoading(true) mHandler?.postDelayed({ pro_progress.secondaryProgress = percent * pro_progress.max / 100 }, 0) } override fun onPrepared(duration: Long) { mHandler?.postDelayed({ pro_progress.max = duration.toInt() text_end_time.text = getStringTime(pro_progress.max) var index = AudioPlayer.get().getMusicList()?.indexOf(AudioPlayer.get().playMusic) ?: 0 listener?.onPrepared( AudioPlayer.get().playMusic, index ) }, 0) } override fun onComplete() { updateButton() } private fun showBufferLoading(show: Boolean) { mHandler?.postDelayed({ if (show) { if (!AudioPlayer.get().isPlaying) { if (mContext != null) { displayImage(com.yidianling.course.R.drawable.course_loading5,img_gif,true) } course_audio_play_icon.setImageResource(com.yidianling.course.R.drawable.course_ico_course_play) } } else { if (mContext != null) { displayImage(com.yidianling.course.R.drawable.course_audio_play,img_gif,true) } course_audio_play_icon.setImageResource(com.yidianling.course.R.drawable.course_ico_course_pause) } }, 0) } //显示或隐藏播放动画 private fun setGifVisibity(show: Boolean) { if (mContext == null) return mHandler?.postDelayed({ if (show) { displayImage(com.yidianling.course.R.drawable.course_audio_play,img_gif,true) course_audio_play_icon.setImageResource(com.yidianling.course.R.drawable.course_ico_course_pause) } else { displayImage(com.yidianling.course.R.drawable.course_ico_course_bg_pause,img_gif) course_audio_play_icon.setImageResource(com.yidianling.course.R.drawable.course_ico_course_play) } }, 0) } //跟新上下音频按钮状态 private fun updateButton() { mHandler?.postDelayed({ if (AudioPlayer.get().isPlaying) { setGifVisibity(true) } }, 300) } fun getStringTime(time: Int): String { if (time <= 0) return "00:00" var min = time / 60000 var ss = (time - min * 60000) / 1000 var mm = "" + min var SS = "" + ss if (min < 10) { mm = "0$mm" } if (ss < 10) { SS = "0$ss" } return "$mm:$SS" } fun onDestroy() { AudioPlayer.get().removeOnPlayEventListener(this) mContext = null mHandler = null } /** * 加载Image */ private fun displayImage(@RawRes @DrawableRes @Nullable resourceId: Int, imageView: ImageView , isGif:Boolean = false) { //判断当前页面是否销毁 if (!isDestroy()) { if(isGif){ mContext?.let { Glide.with(it).asGif().load(resourceId).into(imageView) } }else { mContext?.let { Glide.with(it).asBitmap().load(resourceId).into(imageView) } } } } /** * 判断Activity是否Destroy * @param activity * @return */ fun isDestroy(): Boolean { return mContext == null || mContext!!.isFinishing || Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && mContext!!.isDestroyed } }