Android 12新特性之获取壁纸主色调并设置系统主题色

582 阅读2分钟

Android 12新特性之获取壁纸主色调并设置系统主题色

  关注这个问题首先是因为我队友某天吐槽,说整些奇奇怪怪的东西不如整个什么手机自适应手机壳主题。当然这个东西不是那么好实现的,毕竟已经脱离了软件层面涉及到硬件层面了。但是,转念一想,是否可以弄一个自适应壁纸主题,这样就可以统一一下整个系统的观感。Android 12确实满足了这个幻想,在其新特性中,赫然便是一项:用户可根据壁纸主色调更换系统主题色。

img

  首先,我们需要获取当前壁纸。这里有两种方法,第一种是直接访问Android的壁纸目录:(老版本)/data/data/com.android.settings/files/wallpaper,(新版本)/data/system/users/0/wallpaper,这种稍后再说。第二种是使用WallpaperManager类获取当前壁纸。

  1. FLAG_LOCK可获取当前锁屏壁纸
  2. 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.from(m_Bitmap).generate(); // 同步

Palette m_Palette_Async = Palette.from(m_Bitmap).generateAsync(); // 异步

  这样我们可以获取到不同的颜色样本

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

关注公众号:Android老皮
解锁  《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔