样式和主题

Catalogue   

概述

样式是一个属性集合,用于指定单个 View 的外观。样式可以指定字体颜色、字号、背景颜色等属性。

主题背景是应用于整个应用、Activity 或视图层次结构,而非仅仅应用于单个视图的属性集合。当您应用主题背景时,应用或 Activity 中的每个视图都会
应用其支持的每个主题背景属性。主题还可以将样式应用于非视图元素,例如状态栏和窗口背景。主题可以理解成样式的集合。

样式

定义样式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encodeing="utf-8"?>
<resource>

<style name="BaseToolBarLine">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">1px</item>
<item name="android:background">@color/base_toolbar_line_color</item>
</style>

<style name="CodeFontRed" parent="CodeFont">
<item name="android:textColor">#FF0000</item>
</style>
<!-- 样式是可以继承的 -->
<style name="CodeFont.Red">
<item name="android:textColor">#FF0000</item>
</style>
</resource>

在布局文件中使用样式

1
<View style="@style/BaseToolBarLine" />

如果有多个module,需要注意样式的继承,以免出现,子module修改了某个同名的style,造成父module中的样式被修改。

主题

Android的主题发展历史

  1. 在Android3.0之前,Android的界面不论是从系统还是空间的主题都是按钮为白色,点击事件为黄色。现在看来很简陋

  2. Holo主题:Android3.0 (API11)开始,Google推出了Holo主题(就是我们印象中的黑底白字蓝主色的主题)。在4.0google又发布了应用设计规范Android Design。
    有了设计规范的指导,就有了更多的应用采用Holo主题。所以我们可以简单认为Android Design就是Holo主题。但是这种主题是适合移动设备,其他平台略显突兀。

  3. 在4.0之前Android可以说是没有设计可言的,在4.0之后推出了Android Design,从此Android在设计上有了很大的改善,而在程序实现上相应的就是Holo风格,
    所以你看到有类似 Theme.Holo.Light、 Theme.Holo.Light.DarkActionBar 就是4.0的设计风格,但是为了让4.0之前的版本也能有这种风格怎么办呢?
    这个时候就不得不引用v7包了,所以对应的就有 Theme.AppCompat.Light、Theme.AppCompat.Light.DarkActionBar,如果你的程序最小支持的版本是
    API14(即Android 4.0),那么可以不用考虑v7的兼容

  4. Material 主题:从Android5.0(API21)开始,Google又推出了材料设计语言Material Design,又叫Google Design。MD崇尚的就是图层扁平化,
    所有图层像纸或者卡片一样重叠在一起,所以Android5.0就有了RecyclerView和CardView。图层之间有间隔,所以Android5.0中有了translation和elevation
    两个属性。同时也规范了Android的运动元素,界面上的每个元素不是无故产生的,同时每个图层的产生和消失都有方向的约定,从哪里来就往哪里去,
    这也是为什么Android 5.0中会有Ripple,Circular Receal,Activity Transition

  5. Android在5.0版本推出了Material Design的概念,这是Android设计上又一大突破。对应的程序实现上就有Theme.Material.Light、
    Theme.Material.Light.DarkActionBar等,但是这种风格只能应用在在5.0版本的手机,如果在5.0之前应用Material Design该怎么办呢?
    同样的引用appcompat-v7包,这个时候的Theme.AppCompat.Light、Theme.AppCompat.Light.DarkActionBar就是相对应兼容的Material Design的Theme。

主题也跟样式一样是可以继承的,主题的根在themes.xml文件中。定义了<style name="Theme"></style>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<style name="Theme"></style>
<!-- 黑色背景-->
<style name="Theme.Black">
<item name="windowBackground">@color/black</item>
<item name="colorBackground">@color/black</item>
</style>
<!-- 没有标题 -->
<style name="Theme.Black.NoTitleBar">
<item name="windowNoTitle">true</item>
</style>
<!--兼容主题的根主题 -->
<style name="Theme.AppCompat" parent="Base.Theme.AppCompat"/>
<style name="Theme.AppCompat.Dialog" parent="Base.Theme.AppCompat.Dialog"/>
<!-- 没有actionbar -->
<style name="Theme.AppCompat.Light.NoActionBar">
<!-- 这里是AppCompat定义的属性,另外还有android:windowNoTitle属性 -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>

常用属性

1
2
3
4
5
6
7
8
9
10
11
12
13

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowFrame">@null</item> Dialog的windowFrame框为无
<item name="android:windowIsFloating">true</item> 是否浮现在activity之上
<item name="android:windowIsTranslucent">false</item> 是否半透明
<item name="android:windowNoTitle">true</item> 是否显示title
<item name="android:windowBackground">@drawable/dia_bg</item> 设置背景
<item name="android:backgroundDimEnabled">false</item> 背景是否变暗
<item name="android:windowAnimationStyle">@style/AnimBottom</item> 窗口的动画设置
<item name="android:windowContentOverlay">@null</item> 这个drawable会覆盖在content区域的上面
<item name="android:windowIsFloating">true</item> Dialog弹窗漂浮

参考