《Android编程权威指南》之样式与主题篇

此章的内容比较简单,学习此章的目的呢,也是为了简化代码去美化页面,定制出APP的独特风格。

颜色资源

  • res/value中color.xml文件 —— 方便在一处定义各种颜色值供应用引用
截图取自Demo项目
  • 引用方式 : R.color.xxx
  • 颜色定义方式
    • 三原色:白光 可以分解为 红、 绿、蓝 三种颜色的光, 红绿蓝都是最大值的时候就是白色,三种值相等,但不是最大值是灰色, 如果其中一种或两种值比较大, 就会产生各种颜色的彩色;
    • 颜色表示:颜色通过红(red) 绿(green)蓝(blue)三种颜色, 以及 透明度(alpha)来表示的;
    • 颜色开头: 颜色值总是以 # 开头;
    • 无透明度:如果没有 alpha 值, 默认完全不透明;
  • 颜色定义形式:
    • RGB: 红 绿 蓝 三原色值,每个值分16个等级, 最小为0,最大为f;
    • ARGB:透明度 红 绿 蓝 值,每个值分16个等级,最小为0,最大为f;
    • RRGGBB:红 绿 蓝 三原色值,每个值分 256个等级, 最小为0,最大为ff;
    • AARRGGBB:透明度 红 绿 蓝 值,每个值分 256个等级,最小为0,最大为ff;

样式

样式是一套能够应用于视图的属性,可以为很多组件共用,更新修改属性时,只修改公共样式定义即可。

  • 添加样式(res/values/styles.xml)
截图取自demo项目
  • 使用样式
截图取自demo项目

样式继承

样式支持继承,一个样式能继承并覆盖其他样式的属性。

截图取自demo

BeatBoxBtn.Strong的命名表示这个新样式继承了BeatBoxBtn样式的属性

截图取自demo

指定父样式的方式也可以表示样式继承。

主题

主题可以看作样式的进化加强版。同样是定义一套公共主题属性,样式属性需要逐个添加,而主题则会自动应用于整个应用。主题属性能引用颜色这样的外部资源,也能引用其他样式。

修改默认主题

自带默认主题AndroidManifest.xml文件,application标签下的theme属性,指向AppTheme主题,也是定义在styles.xml中。

截图取自demo
主题实际上就是一种样式,但是主题指定的属性有别于样式。

截图取自demo
  • AppCompat库自带三大主题:
    • Theme.AppCompat —— 深色主题
    • Theme.AppCompat.Light —— 浅色主题
    • Theme.AppCompat.Light.DarkActionBar —— 带深色工具栏的浅色主题

添加主题颜色

在style.xml中,为AppTheme主题添加三个自定义属性

截图取自demo
样式主题仅适用于单个组件;主题属性适用于所有使用同一主题的组件。colorPrimary属性主要用来设置工具栏背景色,也可称为应用品牌色,colorPrimaryDark用户屏幕顶部的状态栏,colorAccent主要用于给EditText这样的组件着色。注意:只有Lollipop以后的系统支持状态栏主题颜色。对于之前的系统,无论指定什么主题颜色,状态栏都是不变的黑底色。

从网上截了个图,看图就明白了这些属性的意思啦!

截图取自网上

注意,只有Lollipop以后的系统支持状态栏主题色。对于之前的系统,无论指定什么主题色,状态栏都是不变的黑底色。

覆盖主题属性

主题已经设置了背景色,在此基础上再设置其他颜色,就是多出来在做额外的工作。而且,在应用里到处复制使用背景属性设置代码也不利于后期维护。

  • 主题探秘
    探秘Theme.AppCompat,一层层来看,找到源码,它是继承Base.Theme.AppCompat,本身没有任何属性。

    Paste_Image.png
    再点进去,多个版本,随意进了一个:

    Paste_Image.png
    第一个:

    Paste_Image.png
    再进:(部分截图)

    Paste_Image.png
    可以看到定义了很多属性,还有注释,但是没有找到背景色的属性,所以继续,这里也有好几个版本,随意选一个,我均选的第一个:

    Paste_Image.png
    这里看到父主题android:Theme,注意不是Theme,而是android:Theme。android命名空间不能丢。
    AppCompat库可以看作应用的一部分,编译项目时,工具会引入AppCompat库和它的一堆Java和XML文件。这些文件已包含在应用里,如同自己编写的文件。若想引用AppCompat库里的资源,像Theme.AppCompat这样,直接引用即可。有些主题包含在Android系统里,引用时必须加上命名空间,如Theme。所以,在引用Theme主题时,AppCompat库就使用了android:Theme这样的形式。
    这里已经能找到主题背景色的属性了:
<item name="android:colorBackground">@color/background_material_dark</item>

再定位到Theme中看看也行(截图只取部分),也看到了这个属性:

Paste_Image.png

回到styles.xml文件,覆盖背景属性,即可改变整个应用的背景颜色:

Paste_Image.png
我实际操作的主题继承层次跟此书中的有点改变,想找哪个属性,按照这种方式找就OK了,截图均为我实际操作得到。

修改按钮属性

可在主题中定义一个用户所有按钮的样式,刚刚Base.V7.Theme.AppCompat中和Theme中均有buttonStyle属性,即应用中普通按钮的样式。

Base.V7.Theme.AppCompat
Theme

Theme中Widget.Button

应用中所有按钮都使用了这些属性。
修改按钮的父样式,根据需求,有选择性的修改一些属性。

Paste_Image.png

然后修改主题的buttonStyle属性:


Paste_Image.png

搞定。
注意,定义buttonStyle时,没有使用android:前缀。这是因为,要覆盖的buttonStyle属性是在AppCompat库里实现的。

深入学习:样式继承拾遗

要以主题名的形式指定父主题,有继承关系的两个主题都应处于同一个包中。因此,对于Android操作系统内部主题间的继承,就可以直接使用主题名继承表示法。同理,AppCompat库内部也是这样。然而,一旦AppCompat库要跨库继承,就一定要使用parent属性。

开发自己应用时,如果是继承自己内部的主题,使用主题名指定父主题即可;如果是继承Android操作系统中的样式或主题,记得使用parent属性。

深入学习:引入主题属性

在主题定义好属性后,可以在XML或代码中直接使用它们。

Paste_Image.png
上述中?符号的意思是使用colorAccent属性指向的资源。这里指定义在colors.xml中的粉色。

代码中使用主题属性比较啰嗦:

Resources.Theme theme = getActivity().getTheme();
        int[] attrsToFetch = {R.attr.colorAccent};
        TypedArray a = theme.obtainStyledAttributes(R.style.AppTheme, attrsToFetch);
        int accentColor = a.getInt(0, 0);
        a.recycle();

先取得Theme对象,然后要求它找到定义在AppTheme(即R.style.AppTheme)中的R.attr.colorAccent属性。结果得到一个持有数据的TypedArray对象。接着,像TypedArray对象索要int值以取出颜色即可使用了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容