前面一部分主要是摘录自Flywith24 的 Android Styling系列文章(主要为了整理和理解方便😂),强烈建议大家看大佬的原文
一、Theme 和 Style的区别
Style是什么?
Style是view的属性的集合 ,你可以将style视为Map<view attribute,resource>
。这里的key是view的所有属性,都是可以在layout文件中配置的
一个style只能作用于其应用的view,不包含它的子view。使用时用style
标签
![Style 作用范围](https://i-blog.csdnimg.cn/blog_migrate/e55260a3f6accfacb479c9ba839a79ce.png)
Theme是什么?
Theme是资源的集合,它可以被style、layout或者其他引用。它为android资源提供语义明确的命名,如下:
<style name="Theme.Plaid" parent="…">
<item name="colorPrimary">@color/teal_500</item>
<item name="colorSecondary">@color/pink_200</item>
<item name="android:windowBackground">@color/white</item>
</style>
Theme为这些已命名的资源提供正确的值,应用在整个app中。在引用主题属性时,可以使用?attr/
语法,其中?
代表在当前主题中搜索。
Theme可以在application
、Activity
、View
中设置,可以作为Context的属性被获取,也可以通过ContextThemeWrapper
包装现有的Context来在代码中设置theme,然后将其用于inflate布局,具体使用方法看第三节
定义的theme会生成一个树,在此树的任何级别上指定主题都会影响到后代节点。使用时用theme
标签
![theme 作用范围](https://i-blog.csdnimg.cn/blog_migrate/ca62fe022bbdd75f267a78d022a048dd.png)
总结下:
概念 | 作用范围 | |
---|---|---|
Style | view的属性集合 | 只作用于应用的view,没有继承关系 |
Theme | 资源的集合 | 会作用于树中所有子节点,有继承关系 |
二、常用主题属性
上面说到,?attr/
表示在当前主题中搜索资源,?attr/
后面的内容需要在attr.xml
文件中定义。系统已经定义了一些常用的主题属性名,我们可以直接拿来用,看这里:Color Theming
Colors
?attr/colorPrimary
app 主色?attr/colorSecondary
app 次级颜色,通常作为主色的补充?attr/colorOn[Primary, Secondary, Surface etc]
与命名颜色形成对比的颜色,常用来定义文字颜色?attr/color[Primary, Secondary]Variant
给定颜色的阴影?attr/colorSurface
组件界面(卡片,表格,菜单等)的颜色?android:attr/colorBackground
背景?attr/colorPrimarySurface
在浅色主题的colorPrimary
和深色主题的colorSurface
间切换?attr/colorError
错误消息的颜色?attr/colorControlNormal
正常状态下图标/控件的颜色?attr/colorControlActivated
激活状态下图标/控件的颜色(例如 checked)?attr/colorControlHighlight
高亮颜色(例如 ripples, list selectors)?android:attr/textColorPrimary
text 突出颜色?android:attr/textColorSecondary
text 次要颜色
Dimens
?attr/listPreferredItemHeight
list item 的标准(最小)高度?attr/actionBarSize
toolbar 的高度
Drawables
-
?attr/selectableItemBackground
当前交互项的水波纹/高亮(也为前景提供了便利) -
?attr/selectableItemBackgroundBorderless
无界的水波纹 -
?attr/dividerVertical
一个可绘制对象,可用作元素之间的垂直分隔线 -
?attr/dividerHorizontal
一个可绘制对象,可用作元素之间的水平分隔线
TextAppearances
放在type.xml
文件中,定义常用字体大小,在TextView中可以使用如下方式引用
android:textAppearance="?attr/textAppearanceBody1"
-
?attr/textAppearanceHeadline1
默认的浅色 96sp 文本 -
?attr/textAppearanceHeadline2
默认的浅色 60sp 文本 -
?attr/textAppearanceHeadline3
默认的普通 48sp 文本 -
?attr/textAppearanceHeadline4
默认的普通 34sp 文本 -
?attr/textAppearanceHeadline5
默认的普通 24sp 文本 -
?attr/textAppearanceHeadline6
默认的中等 20sp 文本 -
?attr/textAppearanceSubtitle1
默认的普通 16sp 文本 -
?attr/textAppearanceSubtitle2
默认的中等 14sp 文本 -
?attr/textAppearanceBody1
默认的普通 16sp 文本,默认字样式 -
?attr/textAppearanceBody2
默认的普通 14sp 文本 -
?attr/textAppearanceCaption
默认普通 12sp 文本 -
?attr/textAppearanceButton
默认的中等全大写 14sp 文本 -
?attr/textAppearanceOverline
默认的中等全大写 10sp 文本
Shape
放在shape.xml
文件中,定义一些常用形状的圆角等属性,具体使用方式可以看这里:Shape Theming。要在自定义组件上设置shape,可能需要使用MaterialShapeDrawable
,它可以理解并实现shape
-
?attr/shapeAppearanceSmallComponent
在 Button ,Chip,Text 的属性中使用,默认 4dp 的圆角 -
?attr/shapeAppearanceMediumComponent
在 Card,Dialog,Date Picker 中使用,默认 4dp 的圆角 -
?attr/shapeAppearanceLargeComponent
在 Bottom Sheet 中使用,默认 0dp 圆角
Button Styles
!["Button types - text, outlined, contained and toggle."](https://i-blog.csdnimg.cn/blog_migrate/e0414b00b1e6f38e8e695138b326359e.png)
Material 定义了四种类型的Button:Text、Outlined、Contained、Toggle,可用于设置MaterialButton
的 style,具体使用看这里:Buttons
-
?attr/materialButtonStyle
默认样式,可省略 -
?attr/borderlessButtonStyle
文本样式的 button -
?attr/materialButtonOutlinedStyle
outline 样式的 button -
?attr/materialButtonToggleGroupStyle
Toggle样式的button。Toggle类型按钮使用MaterialButtonToggleGroup
,示例如下:<com.google.android.material.button.MaterialButtonToggleGroup android:id="@+id/toggleButton" android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button 1" style="?attr/materialButtonOutlinedStyle" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button 2"