1. Launcher3图标白边问题的由来
如果你仔细观察过Android手机上的应用图标,可能会发现有些图标周围有一圈明显的白边。这种现象在Android 8.0(Oreo)之后尤为常见,特别是那些没有适配新图标标准的应用。这个白边并不是开发者有意设计的,而是系统Launcher3自动添加的。
Launcher3作为Android系统的默认桌面应用,负责管理主屏幕、应用抽屉和图标显示。在Android 8.0引入自适应图标(Adaptive Icons)功能后,系统要求所有应用图标都遵循新的设计规范。对于那些没有及时适配的应用图标,Launcher3会自动为其添加白边,使其看起来与其他图标保持一致的视觉效果。
这种设计初衷是好的,但在实际使用中却带来了不少问题。首先,白边会让图标看起来比实际尺寸小,影响视觉体验;其次,有些应用本身已经设计了合适的背景,再加上系统白边就显得多余;最重要的是,这种强制性的统一处理剥夺了开发者对图标设计的自主权。
2. BaseIconFactory的核心作用
2.1 BaseIconFactory类解析
BaseIconFactory是Launcher3中负责图标生成的核心类,位于/frameworks/libs/systemui/iconloaderlib/src/com/android/launcher3/icons/路径下。这个类的主要职责包括:
- 图标尺寸标准化处理
- 非自适应图标的包装处理
- 图标缩放比例计算
- 白边添加逻辑实现
其中最关键的方法是normalizeAndWrapToAdaptiveIcon,这个方法决定了如何处理非自适应图标。当Launcher3加载一个应用图标时,会先判断它是否是自适应图标。如果不是,就会调用这个方法为其添加白边。
2.2 白边生成的关键代码
在BaseIconFactory中,白边的生成主要依赖于以下代码逻辑:
if (shrinkNonAdaptiveIcons && !(icon instanceof AdaptiveIconDrawable)) {
if (mWrapperIcon == null) {
mWrapperIcon = mContext.getDrawable(R.drawable.adaptive_icon_drawable_wrapper)
.mutate();
}
AdaptiveIconDrawable dr = (AdaptiveIconDrawable) mWrapperIcon;
dr.setBounds(0, 0, 1, 1);
boolean[] outShape = new boolean[1];
scale = getNormalizer().getScale(icon, outIconBounds, dr.getIconMask(), outShape);
if (!outShape[0]) {
FixedScaleDrawable fsd = ((FixedScaleDrawable) dr.getForeground());

367

被折叠的 条评论
为什么被折叠?



