From ac261838904a3bc061f7ebc7f95662aedf7d117c Mon Sep 17 00:00:00 2001 From: ocean <503259349@qq.com> Date: Fri, 17 May 2024 18:03:28 +0800 Subject: [PATCH] update --- .../musicoo/activity/MoPlayDetailsActivity.kt | 1 - .../musicoo/adapter/DetailsListAdapter.kt | 14 ++++ .../player/musicoo/adapter/PlayListAdapter.kt | 2 + .../musicoo/adapter/ResponsiveListAdapter.kt | 21 ++++- .../player/musicoo/fragment/MoBaseFragment.kt | 12 ++- .../player/musicoo/fragment/MoHomeFragment.kt | 29 +++++-- .../com/player/musicoo/view/MusicBarsView.kt | 84 +++++++++++++++++++ .../musicoo/view/MusicResponsiveListView.kt | 12 ++- app/src/main/res/drawable/list_play_icon.xml | 9 ++ app/src/main/res/layout/details_list_item.xml | 26 +++--- .../main/res/layout/music_responsive_item.xml | 51 +++++++---- app/src/main/res/layout/play_list_item.xml | 14 ++++ app/src/main/res/values/colors.xml | 1 + 13 files changed, 237 insertions(+), 39 deletions(-) create mode 100644 app/src/main/java/com/player/musicoo/view/MusicBarsView.kt create mode 100644 app/src/main/res/drawable/list_play_icon.xml diff --git a/app/src/main/java/com/player/musicoo/activity/MoPlayDetailsActivity.kt b/app/src/main/java/com/player/musicoo/activity/MoPlayDetailsActivity.kt index b0b99c8..1d48a3b 100644 --- a/app/src/main/java/com/player/musicoo/activity/MoPlayDetailsActivity.kt +++ b/app/src/main/java/com/player/musicoo/activity/MoPlayDetailsActivity.kt @@ -103,7 +103,6 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { } } - onReceive() } diff --git a/app/src/main/java/com/player/musicoo/adapter/DetailsListAdapter.kt b/app/src/main/java/com/player/musicoo/adapter/DetailsListAdapter.kt index 46ae459..3b7e066 100644 --- a/app/src/main/java/com/player/musicoo/adapter/DetailsListAdapter.kt +++ b/app/src/main/java/com/player/musicoo/adapter/DetailsListAdapter.kt @@ -6,6 +6,7 @@ import android.content.Intent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.compose.ui.graphics.Color import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.player.musicoo.App @@ -88,9 +89,22 @@ class DetailsListAdapter( if (meController.currentMediaItem?.mediaId == bean.videoId) { binding.title.setTextColor(context.getColor(R.color.green)) binding.name.setTextColor(context.getColor(R.color.green_60)) + + binding.listPlayView.visibility = View.VISIBLE + binding.sortTv.visibility = View.GONE + if (image.visibility == View.GONE) { + binding.listPlayView.setBackgroundColor(context.getColor(R.color.transparent)) + } else { + binding.listPlayView.setBackgroundColor(context.getColor(R.color.black_60)) + } } else { binding.title.setTextColor(context.getColor(R.color.white)) binding.name.setTextColor(context.getColor(R.color.white_60)) + + binding.listPlayView.visibility = View.GONE + if (image.visibility == View.GONE) { + binding.sortTv.visibility = View.VISIBLE + } } } } diff --git a/app/src/main/java/com/player/musicoo/adapter/PlayListAdapter.kt b/app/src/main/java/com/player/musicoo/adapter/PlayListAdapter.kt index de5e937..07cdaf2 100644 --- a/app/src/main/java/com/player/musicoo/adapter/PlayListAdapter.kt +++ b/app/src/main/java/com/player/musicoo/adapter/PlayListAdapter.kt @@ -67,11 +67,13 @@ class PlayListAdapter( val meController = MediaControllerManager.getController() if (meController != null && meController.currentMediaItem != null) { if (meController.currentMediaItem?.mediaId == bean.mediaId) { + binding.listPlayView.visibility = View.VISIBLE binding.title.setTextColor(context.getColor(R.color.green)) binding.name.setTextColor(context.getColor(R.color.green_60)) } else { binding.title.setTextColor(context.getColor(R.color.white)) binding.name.setTextColor(context.getColor(R.color.white_60)) + binding.listPlayView.visibility = View.GONE } } } diff --git a/app/src/main/java/com/player/musicoo/adapter/ResponsiveListAdapter.kt b/app/src/main/java/com/player/musicoo/adapter/ResponsiveListAdapter.kt index 6f13d16..5841846 100644 --- a/app/src/main/java/com/player/musicoo/adapter/ResponsiveListAdapter.kt +++ b/app/src/main/java/com/player/musicoo/adapter/ResponsiveListAdapter.kt @@ -3,13 +3,16 @@ package com.player.musicoo.adapter import android.content.Context import android.content.Intent import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide +import com.player.musicoo.R import com.player.musicoo.activity.MoPlayDetailsActivity import com.player.musicoo.databinding.MusicResponsiveItemBinding import com.player.musicoo.innertube.models.MusicCarouselShelfRenderer import com.player.musicoo.innertube.models.bodies.NextBody +import com.player.musicoo.media.MediaControllerManager class ResponsiveListAdapter( private val context: Context, @@ -63,7 +66,7 @@ class ResponsiveListAdapter( val playlistSetVideoId = watchEndpoint?.playlistSetVideoId val params = watchEndpoint?.params - holder.bind(url, name, desc) + holder.bind(url, name, desc, videoId) holder.itemView.setOnClickListener { val intent = Intent(context, MoPlayDetailsActivity::class.java) @@ -87,7 +90,7 @@ class ResponsiveListAdapter( inner class ViewHolder(private val binding: MusicResponsiveItemBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(url: String?, name: String?, desc: String?) { + fun bind(url: String?, name: String?, desc: String?, videoID: String?) { binding.apply { Glide.with(context) @@ -95,6 +98,20 @@ class ResponsiveListAdapter( .into(image) nameTv.text = name descTv.text = desc + + + val meController = MediaControllerManager.getController() + if (meController != null && meController.currentMediaItem != null) { + if (meController.currentMediaItem?.mediaId == videoID) { + binding.listPlayView.visibility = View.VISIBLE + binding.nameTv.setTextColor(context.getColor(R.color.green)) + binding.descTv.setTextColor(context.getColor(R.color.green_60)) + } else { + binding.nameTv.setTextColor(context.getColor(R.color.white)) + binding.descTv.setTextColor(context.getColor(R.color.white_60)) + binding.listPlayView.visibility = View.GONE + } + } } } } diff --git a/app/src/main/java/com/player/musicoo/fragment/MoBaseFragment.kt b/app/src/main/java/com/player/musicoo/fragment/MoBaseFragment.kt index 916034c..f2038d6 100644 --- a/app/src/main/java/com/player/musicoo/fragment/MoBaseFragment.kt +++ b/app/src/main/java/com/player/musicoo/fragment/MoBaseFragment.kt @@ -6,20 +6,25 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.viewbinding.ViewBinding -import com.player.musicoo.databinding.FragmentMoHomeBinding +import com.player.musicoo.activity.MoBaseActivity import com.player.musicoo.sp.AppStore import com.player.musicoo.util.LogTag import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel +import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.launch abstract class MoBaseFragment : Fragment(), CoroutineScope by MainScope() { + enum class Event { + FragmentOnResume, + } protected abstract val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> T protected lateinit var binding: T protected val TAG = LogTag.VO_FRAGMENT_LOG protected val appStore by lazy { AppStore(requireContext()) } + protected val events = Channel(Channel.UNLIMITED) protected abstract suspend fun onViewCreated() @@ -44,4 +49,9 @@ abstract class MoBaseFragment : Fragment(), CoroutineScope by M super.onDestroy() cancel() } + + override fun onResume() { + super.onResume() + events.trySend(Event.FragmentOnResume) + } } diff --git a/app/src/main/java/com/player/musicoo/fragment/MoHomeFragment.kt b/app/src/main/java/com/player/musicoo/fragment/MoHomeFragment.kt index e228b7e..bc611dd 100644 --- a/app/src/main/java/com/player/musicoo/fragment/MoHomeFragment.kt +++ b/app/src/main/java/com/player/musicoo/fragment/MoHomeFragment.kt @@ -3,6 +3,7 @@ package com.player.musicoo.fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.allViews import com.gyf.immersionbar.ktx.immersionBar import com.player.musicoo.databinding.FragmentMoHomeBinding import com.player.musicoo.innertube.Innertube @@ -50,6 +51,13 @@ class MoHomeFragment : MoBaseFragment() { } } } + events.onReceive { + when (it) { + Event.FragmentOnResume -> { + fragmentOnResume() + } + } + } } } } @@ -104,12 +112,9 @@ class MoHomeFragment : MoBaseFragment() { for (home: Innertube.HomePage in it.homePage) { for (content: MusicCarouselShelfRenderer.Content in home.contents) { if (content.musicResponsiveListItemRenderer != null) { - binding.contentLayout.addView( - MusicResponsiveListView( - requireActivity(), - home - ) - ) + val musicResponsiveListView = + MusicResponsiveListView(requireActivity(), home) + binding.contentLayout.addView(musicResponsiveListView) break } if (content.musicTwoRowItemRenderer != null) { @@ -130,6 +135,18 @@ class MoHomeFragment : MoBaseFragment() { } } + private fun fragmentOnResume(){ + refreshAdapters() + } + + private fun refreshAdapters() {//刷新home的单曲ui + for (i in 0 until binding.contentLayout.childCount) { + val child = binding.contentLayout.getChildAt(i) + if (child is MusicResponsiveListView) { + child.updateAdapter() + } + } + } override fun onResume() { super.onResume() initImmersionBar() diff --git a/app/src/main/java/com/player/musicoo/view/MusicBarsView.kt b/app/src/main/java/com/player/musicoo/view/MusicBarsView.kt new file mode 100644 index 0000000..39311be --- /dev/null +++ b/app/src/main/java/com/player/musicoo/view/MusicBarsView.kt @@ -0,0 +1,84 @@ +package com.player.musicoo.view + +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.util.AttributeSet +import android.util.TypedValue +import android.view.View + +class MusicBarsView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : View(context, attrs, defStyleAttr) { + + // 用于绘制柱子的 Paint 对象 + private val barPaint = Paint().apply { + color = Color.parseColor("#FF80F988") + style = Paint.Style.FILL + } + + // 每个柱子的宽度 + private val barWidth = dpToPx(context,4f) + // 柱子之间的间距 + private val barSpacing = dpToPx(context,2f) + // 柱子的圆角半径 + private val cornerRadius = dpToPx(context,16f) + + // 保存每个柱子高度的列表 + private val barHeights = mutableListOf() + + // 保存每个柱子动画的列表 + private val animators = mutableListOf() + + init { + // 初始化柱子的高度并启动动画 + for (i in 0 until 3) { + barHeights.add(0f) + startAnimation(i) + } + } + + // 启动动画 + private fun startAnimation(index: Int) { + val animator = ValueAnimator.ofFloat(0f, 1f).apply { + duration = 500 // 动画持续时间为 500 毫秒 + repeatCount = ValueAnimator.INFINITE // 无限重复动画 + repeatMode = ValueAnimator.REVERSE // 反向重复 + addUpdateListener { animation -> + // 更新柱子的高度 + barHeights[index] = (animation.animatedValue as Float) * height + invalidate() // 重绘 View + } + startDelay = index * 200L // 设置动画的开始延迟时间 + } + animators.add(animator) + animator.start() // 启动动画 + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + + val barCount = barHeights.size + val totalWidth = barCount * barWidth + (barCount - 1) * barSpacing + val startX = (width - totalWidth) / 2 + + // 绘制每个柱子 + barHeights.forEachIndexed { index, barHeight -> + val left = startX + index * (barWidth + barSpacing) + val top = height - barHeight + val right = left + barWidth + val bottom = height.toFloat() + + canvas.drawRoundRect(left, top, right, bottom, cornerRadius, cornerRadius, barPaint) + } + } + + fun dpToPx(context: Context, dp: Float): Float { + return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.resources.displayMetrics) + } +} + diff --git a/app/src/main/java/com/player/musicoo/view/MusicResponsiveListView.kt b/app/src/main/java/com/player/musicoo/view/MusicResponsiveListView.kt index 5689bc1..6e3b29a 100644 --- a/app/src/main/java/com/player/musicoo/view/MusicResponsiveListView.kt +++ b/app/src/main/java/com/player/musicoo/view/MusicResponsiveListView.kt @@ -11,10 +11,14 @@ import com.player.musicoo.adapter.ResponsiveListAdapter import com.player.musicoo.adapter.SoundsOfNatureAdapter import com.player.musicoo.innertube.Innertube import com.player.musicoo.util.GridSpacingItemDecoration +import com.player.musicoo.util.LogTag @SuppressLint("ViewConstructor") class MusicResponsiveListView(context: Context, homePage: Innertube.HomePage) : ModuleView(context) { + + private var adapter: ResponsiveListAdapter? = null + init { contentView = inflate(getContext(), R.layout.music_list_layout, this) val title = contentView?.findViewById(R.id.title) @@ -22,9 +26,15 @@ class MusicResponsiveListView(context: Context, homePage: Innertube.HomePage) : val rv = contentView?.findViewById(R.id.rv) - val adapter = ResponsiveListAdapter(context, homePage.contents) + adapter = ResponsiveListAdapter(context, homePage.contents) rv?.layoutManager = GridLayoutManager(context, 3, GridLayoutManager.HORIZONTAL, false) rv?.adapter = adapter } + @SuppressLint("NotifyDataSetChanged") + fun updateAdapter() { + if (adapter != null) { + adapter?.notifyDataSetChanged() + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/list_play_icon.xml b/app/src/main/res/drawable/list_play_icon.xml new file mode 100644 index 0000000..244dbf1 --- /dev/null +++ b/app/src/main/res/drawable/list_play_icon.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/details_list_item.xml b/app/src/main/res/layout/details_list_item.xml index 388db0c..c486d1e 100644 --- a/app/src/main/res/layout/details_list_item.xml +++ b/app/src/main/res/layout/details_list_item.xml @@ -10,12 +10,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" - android:paddingTop="12dp" - android:orientation="horizontal"> + android:orientation="horizontal" + android:paddingTop="12dp"> + - + android:layout_height="16dp" + android:layout_centerInParent="true" /> + diff --git a/app/src/main/res/layout/music_responsive_item.xml b/app/src/main/res/layout/music_responsive_item.xml index e62d9ac..ce491ea 100644 --- a/app/src/main/res/layout/music_responsive_item.xml +++ b/app/src/main/res/layout/music_responsive_item.xml @@ -12,21 +12,42 @@ android:orientation="horizontal" android:paddingTop="12dp"> - + - + - + + + + + + + + + + + @@ -50,8 +71,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:maxLines="1" android:fontFamily="@font/regular_font" + android:maxLines="1" android:text="@string/app_name" android:textColor="@color/white_60" android:textSize="12dp" /> diff --git a/app/src/main/res/layout/play_list_item.xml b/app/src/main/res/layout/play_list_item.xml index b368964..7fc3087 100644 --- a/app/src/main/res/layout/play_list_item.xml +++ b/app/src/main/res/layout/play_list_item.xml @@ -37,6 +37,20 @@ android:scaleType="centerCrop" android:src="@mipmap/musicoo_logo_img" /> + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 8cb6ce6..d38b82f 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,4 +10,5 @@ #FF80F988 #9980F988 #1A1A1A + #00000000 \ No newline at end of file