关注这个问题首先是因为我队友某天吐槽,说整些奇奇怪怪的东西不如整个什么手机自适应手机壳主题。当然这个东西不是那么好实现的,毕竟已经脱离了软件层面涉及到硬件层面了。但是,转念一想,是否可以弄一个自适应壁纸主题,这样就可以统一一下整个系统的观感。Android 12确实满足了这个幻想,在其新特性中,赫然便是一项:用户可根据壁纸主色调更换系统主题色。
(图来自知乎,侵删)
首先,我们需要获取当前壁纸。这里有两种方法,第一种是直接访问Android的壁纸目录:(老版本)/data/data/com.android.settings/files/wallpaper,(新版本)/data/system/users/0/wallpaper,这种稍后再说。第二种是使用WallpaperManager类获取当前壁纸。
-
FLAG_LOCK可获取当前锁屏壁纸
-
FLAG_SYSTEM可获取当前系统桌面壁纸
WallpaperManager m_WallpaperManager = WallpaperManager.getInstance(this);
BitmapDrawable m_BitmapDrawable = wallpaperManager.getDrawable(); // 默认获取系统壁纸
Bitmap m_BitMap = m_BitmapDrawable.getBitmap(); // 获取系统壁纸的Bitmap
接下来就是获取壁纸的主色调了。这里可以使用Palette,注意使用Palette需要引入库com.android.support:palette-v7:23.2.0(版本号可能不相同)。然后就可以传递上述获取的Bitmap给Palette,并调用Palette.generate()同步或Palette.generateAsync()异步创建一个Palette对象。
Palette m_Palette = Palette.generate(m_Bitmap); // 同步
Palette m_Palette_Async = Palette.generateAsync(m_Bitmap); // 异步
这样我们可以获取到不同的颜色样本
Palette.Swatch VibrantSwatch = palette.getVibrantSwatch(); // 充满活力的色调
Palette.Swatch LightVibrantSwatch = palette.getLightVibrantSwatch(); // 充满活力的亮色调
Palette.Swatch DarkVibrantSwatch = palette.getDarkVibrantSwatch(); // 充满活力的暗色调
Palette.Swatch MutedSwatch = palette.getMutedSwatch(); // 柔和的色调
Palette.Swatch LightMuteSwatch = palette.getLightMutedSwatch(); // 柔和的亮色调
Palette.Swatch DarkMutedSwatch = palette.getDarkMutedSwatch(); // 柔和的暗色调
判空后,就可以获取到我们需要的值了。
vibrant.getPopulation(): // 样本中的像素数量
vibrant.getRgb(): // 颜色的RGB值
vibrant.getHsl(): // 颜色的HSL值
vibrant.getBodyTextColor(): // 主体文字的颜色值
vibrant.getTitleTextColor(): // 标题文字的颜色值
最后只需要修改frameworkd/base/core/res/res/values/themes_material.xml中的颜色值即可
<color name="material_deep_teal_500">#ff008577</color>
可能的确大概是在写废话吧
author: Little_Leier