iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
0
Mobile Development

Android 音樂播放器自己來系列 第 19

播放介面實作(5) - NowPlaying 蓋板UI (抽色)

  • 分享至 

  • xImage
  •  

如果仔細看播歌時的 Notification,可能會注意到不同專輯的歌曲,不同專輯圖都有不同的底色,然後搭配不同字的顏色,這邊在 ExoPlayer 的套件裡設定好了,如果是自己建構 Notification,要如何依據專輯有的顏色來設定背景和字的顏色呢?
https://ithelp.ithome.com.tw/upload/images/20200919/20129728xxLz2JqtmB.png

在 Android 有 Palette API 提供抽色的功能,提供 bitmap,就可以得到這張圖的主題色,還有一些相對應的顏色,細節可以看這篇官方的說明:Selecting Colors with the Palette API
https://ithelp.ithome.com.tw/upload/images/20200919/20129728jZ50baZvZa.png

Ref: Extract color profiles

這張圖就有六種對應的顏色,亮色系的、暗色系的,然後在亮色系的顏色可以選擇對應字體的顏色。如果想直接玩玩看,這邊有現成的 App 可以安裝 Color palette generator for android,可以抽色拍的照片或是相簿內的照片。

implementation 'androidx.palette:palette-ktx:1.0.0'

首先先 import palette library。

Glide.with(view)
         .asBitmap()
         .diskCacheStrategy(DiskCacheStrategy.ALL)
         .load(metadata.albumArtUri)
         .into(object : CustomTarget<Bitmap>() {
               override fun onLoadCleared(placeholder: Drawable?) {
                    //Nothing
               }

               override fun onResourceReady(
                   resource: Bitmap, transition: Transition<in Bitmap>?) {
                       Palette.from(resource).generate { palette ->
                            if (palette == null) return@generate
                            setTitleColor(palette)
                        }
                    }
                })

使用 Glide 的非同步方式,透過 onResourceReady 取得 bitmap,接著就可以使用 Palette,來取得顏色了

private fun setTitleColor(palette: Palette) {
        val bodyColor: Int = palette.getDominantColor(
            ContextCompat.getColor(requireContext(), android.R.color.black)
        )

        val titleTextColor =
            palette.getLightVibrantColor(
                ContextCompat.getColor(requireContext(), android.R.color.white)
            )

        val bodyTextColor =
            palette.getLightMutedColor(
                ContextCompat.getColor(requireContext(), android.R.color.white)
            )

        titleBackground.setBackgroundColor(bodyColor)
        largeTitle.setTextColor(titleTextColor)
        largeSubTitle.setTextColor(bodyTextColor)
    }

透過 Palette 拿來三個顏色,分別設定底色(getDominantColor)、歌曲字體顏色(getLightVibrantColor)、歌手字體顏色(getLightMutedColor)。

成果圖:
https://ithelp.ithome.com.tw/upload/images/20200919/20129728QAO0ilm5Os.png

底色和字體顏色和 Notification 相同啦, Palette 還有其他類型的顏色可以拿,都可以玩玩看,或是將顏色填在其他位置(ex: 整個背景、Status bar)。

程式碼在這,分支名稱(day19_palette_color): Fancy/day19_palette_color


上一篇
播放介面實作(4) - NowPlaying 滿版 UI (資訊顯示)
下一篇
播放介面實作(6) - Widget 基礎
系列文
Android 音樂播放器自己來30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言