推广 热搜:   公司  企业  快速  中国  上海  设备  行业  未来   

android12 原生镜像

   日期:2024-10-06     移动:http://qyn41e.riyuangf.com/quote/15074.html


1.1、调用getWallpaperColors获取壁纸颜色

其实WallpaperManager从很早之前就提供了getWallpaperColors接口
/frameworks/base/core/java/android/app/WallpaperManager.java

1.2、注册OnColorsChangedListener接口监听壁纸颜色

1.2.1、获取整个壁纸颜色

/frameworks/base/core/java/android/app/WallpaperManager.java

使用范例:

1.2.2、获取壁纸区域颜色(需要源码引用)
/frameworks/base/core/java/android/app/WallpaperManager.java

==Tip: LocalWallpaperColorConsumer是hide接口,非源码编译的Apk无法引用==

使用范例:

1.3、使用WallpaperColors

取出的数据都封装在WallpaperColors中,可通过以下接口获取到原始数据
/frameworks/base/core/java/android/app/WallpaperColors.java

框架中只是负责提取出原始颜色,但有些时候直接使用原始颜色,并不能达到最好的效果。

例如:PixelLauncher的插件实现颜色动态变化,除了从Wallpaper中拿到颜色,还进行了二次加工,使其更符合Material Desgin的风格,这也是符合“Monet”主题系统 中的一部分,目前是没有开源的。所以一方或三方若想使用该特性,可以按需进行选择和二次加工。

在Android 13上,内存低的机器 ,最多取出五种色值,内存高的机器,最多取出128种颜色。
/frameworks/base/core/java/android/app/WallpaperColors.java

  • 取出的是一个WallpaperColors对象,其中包含三种主颜色,以及一个保存了所有提取出颜色的Color数组(Hide)。
  • 目前的应用场景主要是PixelLauncher、SystemUI、GBoard

很可惜,Google并没有为动态壁纸提供默认的取色逻辑。

壁纸的取色,最终会调用到WallpaperService的onComputeColors中,但该方法是空实现,框架只是提供了最基本的获取接口而已。

所以在Android 13之前,无论是静态壁纸或是动态 壁纸,若想要其他模块能获取到壁纸颜色的话,需要壁纸提供方,在实现WallpaperService的Engine时,也一并实现onCompleteColors方法,然后在颜色变化时调用notifyColorsChanged。
/frameworks/base/core/java/android/service/wallpaper/WallpaperService.java

如图:

壁纸其实是通过Palette接口进行颜色提取的,基本上都能取到至少一种颜色。当真的取出失败或取出的颜色如果不符合期望,需要采用另外一套默认颜色,这是由各个各个业务去处理的,比如Launcher中的LauncherAppWidgetHostView,重写了setColorResources方法
/packages/apps/Launcher3/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java

具体流程见下图:

android12 原生镜像_android12 原生镜像

PixelLauncher是通过LocalWallpaperColorsExtractor的实现类进行颜色提取,该类继承于LocalColorExtractor,该类存在于Launcher3中,是空实现。可以看出,Google专门将Monet算法部分折分隐藏,只公开框架部分。

而LocalWallpaperColorsExtractor是通过调用WallpaperManager.addOnColorsChangedListener接口,获取onColorsChanged(RectF rectF, WallpaperColors wallpaperColors)中的返回信息,然后再对WallpaperColors中的颜色信息进行二次加工处理。

Widget能使用的色值数量没有限制,从android.R.color.system_neutrall_0(#FFFFFF) 到android.R.color.system_accent3_1000(#000000)都是合法范围。

第三方 Launcher 代码中虽然已经有调用AppWidgetHostView.setColorResources,但是因为其提取颜色的LocalColorExtractor是空实现,所以没有实际效果。而Pixel Launcher 自己写了一个LocalWallpaperColorsExtractor去继承LocalColorExtractor。详见以下代码:

/packages/apps/Launcher3/src/com/android/launcher3/widget/LocalColorExtractor.java

local_colors_extraction_class 该值定义在PixelLauncher中

可以,Android 13已经在secure表中预定义了theme_customization_overlay_packages字段,在其中配置了是否要根据主屏幕变色还是预置颜色,然后进行资源Overlay的。
Android 原生设置入口

android12 原生镜像_java_02

theme_customization_overlay_packages字段含义

我们可以直接使用或借鉴这套逻辑,预置几套色值,并设置为使用基本颜色。

本文地址:http://www.riyuangf.com/quote/15074.html    迅易网 http://www.riyuangf.com/ , 查看更多

特别提示:本信息由相关企业自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


相关行业动态
推荐行业动态
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号