Android- 样式系统 --- 主题背景属性,最新金九银十 Android 面试合集
在某些情况下,您或许不想按照主题背景更改颜色。例如,在?Material Design 规范文档中提到,您可能希望在浅色和深色主题中均使用同一类型的颜色。
Material Design 规范文档 https://material.io/design/color/dark-theme.html#ui-application
在这种特殊情况下,直接引用颜色资源是再合适不过的:
<!-- Copyright 2019 Google LLC.
当前发展状况
当使用?ColorStateLists?时,您可能也不会在您的布局/样式中直接引用主题背景属性。
<!-- Copyright 2019 Google LLC.
ColorStateListshttps://developer.android.google.cn/reference/android/content/res/ColorStateList
如果 primary_20 是一个 ColorStateList,它本身引用主题背景属性来获取色值也可能是合理的 (请参见下文)。ColorStateLists 通常为不同的状态 (按下,禁用等) 提供不同的颜色,但它还有另外一种可用于主题化功能您可在选取的颜色上指定透明度值:
<!-- Copyright 2019 Google LLC.
这种单项 ColorStateList (即只提供单个默认颜色,而非每种状态的不同颜色) 有助于减少您需要维护的颜色资源数量。它并没有定义一个新的颜色资源的方式来手动为您 (每一个配置文件) 的 primary 颜色设置 alpha 值,而是通过改变当前主题背景中的 colorPrimary 的方式。如果您的原始颜色发生了变化,则只需要在一个地方进行更新,无需调整所有已更新的地方。
虽然此技术很有用,但仍有一些注意事项:
1. 如果指定的颜色也具有 alpha 值,则 alpha 会被合并。例如,将 50% 的 alpha 应用于 50% 的不透明白色中,将产生 25% 的白色:
<!-- Copyright 2019 Google LLC.
因此,最好将主题背景颜色指定为完全不透明,然后使用 ColorStateLists 修改它们的 alpha。2. 仅在 API 23 中添加了 alpha 组件,因此,如果您的最小 sdk 低于这个版本,请确保使用支持此行为的?AppCompatResources.getColorStateList?(并始终使用 android:alpha 命名空间,而绝不使用 app:alpha 命名空间)。
AppCompatResources.getColorStateListhttps://developer.android.google.cn/reference/androidx/appcompat/content/res/AppCompatResources.html#getColorStateList(android.content.Context,%20int)
3. 通常,我们使用简写法,将颜色设置为 Drawable,例如:
<!-- Copyright 2019 Google LLC.
View 的背景是一个 Drawable,此简写把给定的颜色强转成了一个?ColorDrawable。但是没有办法把 ColorStateList 转换成 Drawable (API 29 之前使用?ColorStateListDrawable?解决这个问题)。
ColorDrawablehttps://developer.android.google.cn/reference/android/graphics/drawable/ColorDrawable
ColorStateListDrawablehttps://developer.android.google.cn/reference/android/graphics/drawable/ColorStateListDrawable
但是,我们可以通过迂回的方式绕过此限制:
<!-- Copyright 2019 Google LLC.
请确保您的 backgroundTint 支持您的 View 所需的状态,例如,如果被禁用时需要更改。
强制执行
即使您已经说服自己使用主题背景属性和 ColorStateList,但如何在代码库或者团队中使用呢?您可以在 Code review 期间尝试保持警惕,但它的扩展性不是很好。更好的方法是依靠工具来解决此问题。
评论