【转】Android学习系列(39)--Android主题和样式之系统篇(上)
【基于最新的Android4.4的源码分析】
每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui。
所以,学习和理解android的UI设计是最基础和非常有必要的。
android ui设计最重要的就是主题和样式。
1、位置
在Android的frameworks/base/core/res/res/values目录下有一下几个文件:
|
1
2
3
4
|
themes.xmlthemes_device_defaults.xmlstyles.xmlstyles_device_defaults.xml |
分别定义了各种系统Theme,Style。
2、主题Theme
主要关注themes.xml,themes_device_defaults.xml两个文件。
themes.xml定义了android低版本的theme和Holo theme,themes_device_defaults.xml定义了DeviceDefault主题(继承自Holo主题),实际上就是在Holo主题上定制主题(For厂商)。
系统如何去选择默认的主题呢?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
/**frameworks/base/core/java/android/content/res/Resources.java*//** @hide */public static int selectDefaultTheme(int curTheme, int targetSdkVersion) { return selectSystemTheme(curTheme, targetSdkVersion, com.android.internal.R.style.Theme, com.android.internal.R.style.Theme_Holo, com.android.internal.R.style.Theme_DeviceDefault);} /** @hide */public static int selectSystemTheme(int curTheme, int targetSdkVersion, int orig, int holo, int deviceDefault) { if (curTheme != 0) { return curTheme; } if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) { // < 11 return orig; } if (targetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { // < 14 return holo; } return deviceDefault;} |
当<11时,使用以前低版本主题;当>=11&&<14,使用Holo主题;>14的时候,使用DeviceDefault主题。
方便理解,下面把目前所有的版本号列出来,也顺便温习一下android的历史:
3、系统主题Theme列表
系统默认大的主题是三种:Theme,Theme.Holo,Theme.DeviceDefault, 但是实际上在此基础系统还定义了大量的派生主题,最典型的是对应的Light主题。
除此之外,还有很多,在此一一列出,打字太痛苦了,我贴出截图:
了解android系统定义的主题之后,我们就可以根据实际情况在自己的应用中使用这些主题,但是如果想修改主题的某些内容,需要进一步深入。
4、详解每个主题中定义item分类
一个完整的主题应该定义哪些内容呢,以Theme为例,如下:
1)颜色
|
1
2
3
4
5
6
7
8
9
10
|
<item name="colorForeground">@android:color/bright_foreground_dark</item><item name="colorForegroundInverse">@android:color/bright_foreground_dark_inverse</item><item name="colorBackground">@android:color/background_dark</item><item name="colorBackgroundCacheHint">?android:attr/colorBackground</item><item name="colorPressedHighlight">@color/legacy_pressed_highlight</item><item name="colorLongPressedHighlight">@color/legacy_long_pressed_highlight</item><item name="colorFocusedHighlight">@color/legacy_selected_highlight</item><item name="colorMultiSelectHighlight">@color/legacy_selected_highlight</item><item name="colorActivatedHighlight">@color/legacy_selected_highlight</item> |
2)字体
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
<!-- Text styles --><item name="textAppearance">@android:style/TextAppearance</item><item name="textAppearanceInverse">@android:style/TextAppearance.Inverse</item><item name="textColorPrimary">@android:color/primary_text_dark</item><item name="textColorSecondary">@android:color/secondary_text_dark</item><item name="textColorTertiary">@android:color/tertiary_text_dark</item><item name="textColorPrimaryInverse">@android:color/primary_text_light</item><item name="textColorSecondaryInverse">@android:color/secondary_text_light</item><item name="textColorTertiaryInverse">@android:color/tertiary_text_light</item><item name="textColorPrimaryDisableOnly">@android:color/primary_text_dark_disable_only</item><item name="textColorPrimaryInverseDisableOnly">@android:color/primary_text_light_disable_only</item><item name="textColorPrimaryNoDisable">@android:color/primary_text_dark_nodisable</item><item name="textColorSecondaryNoDisable">@android:color/secondary_text_dark_nodisable</item><item name="textColorPrimaryInverseNoDisable">@android:color/primary_text_light_nodisable</item><item name="textColorSecondaryInverseNoDisable">@android:color/secondary_text_light_nodisable</item><item name="textColorHint">@android:color/hint_foreground_dark</item><item name="textColorHintInverse">@android:color/hint_foreground_light</item><item name="textColorSearchUrl">@android:color/search_url_text</item><item name="textColorHighlight">@android:color/highlighted_text_dark</item><item name="textColorHighlightInverse">@android:color/highlighted_text_light</item><item name="textColorLink">@android:color/link_text_dark</item><item name="textColorLinkInverse">@android:color/link_text_light</item><item name="textColorAlertDialogListItem">@android:color/primary_text_light_disable_only</item><item name="textAppearanceLarge">@android:style/TextAppearance.Large</item><item name="textAppearanceMedium">@android:style/TextAppearance.Medium</item><item name="textAppearanceSmall">@android:style/TextAppearance.Small</item><item name="textAppearanceLargeInverse">@android:style/TextAppearance.Large.Inverse</item><item name="textAppearanceMediumInverse">@android:style/TextAppearance.Medium.Inverse</item><item name="textAppearanceSmallInverse">@android:style/TextAppearance.Small.Inverse</item><item name="textAppearanceSearchResultTitle">@android:style/TextAppearance.SearchResult.Title</item><item name="textAppearanceSearchResultSubtitle">@android:style/TextAppearance.SearchResult.Subtitle</item><item name="textAppearanceEasyCorrectSuggestion">@android:style/TextAppearance.EasyCorrectSuggestion</item><item name="textAppearanceMisspelledSuggestion">@android:style/TextAppearance.MisspelledSuggestion</item><item name="textAppearanceAutoCorrectionSuggestion">@android:style/TextAppearance.AutoCorrectionSuggestion</item><item name="textAppearanceButton">@android:style/TextAppearance.Widget.Button</item><item name="editTextColor">@android:color/primary_text_light</item><item name="editTextBackground">@android:drawable/edit_text</item><item name="candidatesTextStyleSpans">@android:string/candidates_style</item><item name="textCheckMark">@android:drawable/indicator_check_mark_dark</item><item name="textCheckMarkInverse">@android:drawable/indicator_check_mark_light</item><item name="textAppearanceLargePopupMenu">@android:style/TextAppearance.Widget.PopupMenu.Large</item><item name="textAppearanceSmallPopupMenu">@android:style/TextAppearance.Widget.PopupMenu.Small</item> |
3)按钮
|
1
2
3
4
5
6
7
8
9
10
11
|
<!-- Button styles --><item name="buttonStyle">@android:style/Widget.Button</item><item name="buttonStyleSmall">@android:style/Widget.Button.Small</item><item name="buttonStyleInset">@android:style/Widget.Button.Inset</item><item name="buttonStyleToggle">@android:style/Widget.Button.Toggle</item><item name="selectableItemBackground">@android:drawable/item_background</item><item name="borderlessButtonStyle">?android:attr/buttonStyle</item><item name="homeAsUpIndicator">@android:drawable/ic_ab_back_holo_dark</item> |
4)List
|
1
2
3
4
5
6
7
8
9
10
11
|
<!-- List attributes --><item name="listPreferredItemHeight">64dip</item><item name="listPreferredItemHeightSmall">?android:attr/listPreferredItemHeight</item><item name="listPreferredItemHeightLarge">?android:attr/listPreferredItemHeight</item><item name="dropdownListPreferredItemHeight">?android:attr/listPreferredItemHeight</item><item name="textAppearanceListItem">?android:attr/textAppearanceLarge</item><item name="textAppearanceListItemSmall">?android:attr/textAppearanceLarge</item><item name="listPreferredItemPaddingLeft">6dip</item><item name="listPreferredItemPaddingRight">6dip</item><item name="listPreferredItemPaddingStart">6dip</item><item name="listPreferredItemPaddingEnd">6dip</item> |
5)Window
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<!-- Window attributes --><item name="windowBackground">@android:drawable/screen_background_selector_dark</item><item name="windowFrame">@null</item><item name="windowNoTitle">false</item><item name="windowFullscreen">false</item><item name="windowOverscan">false</item><item name="windowIsFloating">false</item><item name="windowContentOverlay">@null</item><item name="windowShowWallpaper">false</item><item name="windowTitleStyle">@android:style/WindowTitle</item><item name="windowTitleSize">25dip</item><item name="windowTitleBackgroundStyle">@android:style/WindowTitleBackground</item><item name="android:windowAnimationStyle">@android:style/Animation.Activity</item><item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item><item name="windowActionBar">false</item><item name="windowActionModeOverlay">false</item><item name="windowCloseOnTouchOutside">false</item><item name="windowTranslucentStatus">false</item><item name="windowTranslucentNavigation">false</item> |
6)Dialog
|
1
2
3
4
5
|
<!-- Dialog attributes --><item name="dialogTheme">@android:style/Theme.Dialog</item><item name="dialogTitleIconsDecorLayout">@layout/dialog_title_icons</item><item name="dialogCustomTitleDecorLayout">@layout/dialog_custom_title</item><item name="dialogTitleDecorLayout">@layout/dialog_title</item> |
7)AlertDialog
|
1
2
3
4
5
|
<!-- AlertDialog attributes --><item name="alertDialogTheme">@android:style/Theme.Dialog.Alert</item><item name="alertDialogStyle">@android:style/AlertDialog</item><item name="alertDialogCenterButtons">true</item><item name="alertDialogIcon">@android:drawable/ic_dialog_alert</item> |
8)Panel
|
1
2
3
4
5
6
7
8
9
10
|
<!-- Panel attributes --><item name="panelBackground">@android:drawable/menu_background</item><item name="panelFullBackground">@android:drawable/menu_background_fill_parent_width</item><!-- These three attributes do not seems to be used by the framework. Declared public though --><item name="panelColorBackground">#000</item><item name="panelColorForeground">?android:attr/textColorPrimary</item><item name="panelTextAppearance">?android:attr/textAppearance</item><item name="panelMenuIsCompact">false</item><item name="panelMenuListWidth">296dip</item> |
9)滚动条(Scrollbar)
|
1
2
3
4
5
6
7
8
|
<!-- Scrollbar attributes --><item name="scrollbarFadeDuration">250</item><item name="scrollbarDefaultDelayBeforeFade">300</item><item name="scrollbarSize">10dip</item><item name="scrollbarThumbHorizontal">@android:drawable/scrollbar_handle_horizontal</item><item name="scrollbarThumbVertical">@android:drawable/scrollbar_handle_vertical</item><item name="scrollbarTrackHorizontal">@null</item><item name="scrollbarTrackVertical">@null</item> |
10)文字选中(Text selection)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
<!-- Text selection handle attributes --><item name="textSelectHandleLeft">@android:drawable/text_select_handle_left</item><item name="textSelectHandleRight">@android:drawable/text_select_handle_right</item><item name="textSelectHandle">@android:drawable/text_select_handle_middle</item><item name="textSelectHandleWindowStyle">@android:style/Widget.TextSelectHandle</item><item name="textEditPasteWindowLayout">@android:layout/text_edit_paste_window</item><item name="textEditNoPasteWindowLayout">@android:layout/text_edit_no_paste_window</item><item name="textEditSidePasteWindowLayout">@android:layout/text_edit_side_paste_window</item><item name="textEditSideNoPasteWindowLayout">@android:layout/text_edit_side_no_paste_window</item><item name="textSuggestionsWindowStyle">@android:style/Widget.TextSuggestionsPopupWindow</item><item name="textEditSuggestionItemLayout">@android:layout/text_edit_suggestion_item</item><item name="textCursorDrawable">@null</item> |
有点长,下篇继续列举,并深入分析具体style.
from:http://www.cnblogs.com/qianxudetianxia/p/3725466.html
【转】Android学习系列(39)--Android主题和样式之系统篇(上)的更多相关文章
- Android学习系列(39)--Android主题和样式之系统篇(上)
[基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计 ...
- Android学习系列(36)--App调试内存泄露之Context篇(上)
Context作为最基本的上下文,承载着Activity,Service等最基本组件.当有对象引用到Activity,并不能被回收释放,必将造成大范围的对象无法被回收释放,进而造成内存泄漏. 下面针对 ...
- Android学习系列(37)--App调试内存泄露之Context篇(下)
接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...
- Android学习系列(40)--Android主题和样式之系统篇(下)
11)Widget样式(Widget Style) 特别说明,此处定义大量的系统内置控件的样式,对于重写原生控件的样式具有很大的参考价值. <!-- Widget styles --> & ...
- Android学习系列(38)--Android源码下载和编译
前面多篇文章介绍到如何下载和编译Android或者CM源码,不过一直都是放在<拓展系列>里.随着学习的深入,android源码是非常有参考和学习价值,强烈推荐大家都去下载,编译,学习,所以 ...
- Android学习系列(42)--Android Studio实战技巧
使用android studio开发项目的一些问题,功能和技巧. 1. 环境 Mac OSX 10.9.5 + Android Studio 0.8.9 2. gradle项目加载超慢 这是因为gra ...
- Android学习系列(41)--Android Studio简单使用
1. 环境 UBUNTU 14.04 + Android Studio 0.8.2 2. 安装jdk openjdk-7是一个很好的选择: sudo apt-get update sudo apt-g ...
- Android学习系列(7)--App轮询服务器消息
这篇文章是android开发人员的必备知识. 1.轮询服务器 一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务. 其中需要注意轮询的频率 ...
- Android学习系列(15)--App列表之游标ListView(索引ListView)
游标ListView,提供索引标签,使用户能够快速定位列表项. 也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧. 一看图啥都懂了: 1. ...
随机推荐
- DIY了一下自己blog的UI
当年才学前端时就想改自己blog的UI,然鹅当时没看见那个“申请JS权限”,一直以为blog不能随意DIY样式,只改了少许CSS.现在重新看看设置管理选项,简单修改了一下样式(注意:修改样式之前发邮件 ...
- Java复习第四天
1.Object类 (1)Object是类层次结构的根类,所有的类都直接或者间接的继承自Object类. (2)Object类的构造方法有一个,并且是无参构造:子类构造方法默认访问父类的构造是无参构造 ...
- JVM(二) 对象存活判断和垃圾回收算法
对象的创建 概述 下面简要介绍创建对象的几个重要步骤 : 检查能否在常量池定位到一个类的符号引用,并检查这个符号代表的类是否已被加载,解析和初始化过.如果没有则执行类加载的操作.(即是说对象的引用放在 ...
- webservice log4net日志写入失败
原因1:如果webservice和调用者都部署在一台机器上,日志有可能写到了项目所在目录中,虽然你添加的服务引用是部署在iis下的,但不会写到这.暂时解决办法,把webservice部署到内网服务器上 ...
- Error:All flavors must now belong to a named flavor dimension.
环境 android studio 3.0 错误 Error:All flavors must now belong to a named flavor dimension. 解决 在build.gr ...
- SPOJ QTREE5
题意 一棵\(n\)个点的树,点从\(1\)到\(n\)编号.每个点可能有两种颜色:黑或白. 我们定义\(dist(a,b)\)为点\(a\)至点\(b\)路径上的边个数. 一开始所有的点都是黑色的. ...
- MySQL数据库学习笔记<一>
MySQL基本概念以及简单操作 一.MySQL MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系 ...
- JavaScript练习笔记整理·1 - 6.23
练习平台Codewars地址:https://www.codewars.com/ 欢迎和大家一起来讨论~╭( ・ㅂ・)و ̑̑ 基础练习(1): 我的解答为: class SmallestIn ...
- 定期重启SSRS 服务
SSRS 在执行了一段时间之后会变得非常卡,遇到好几次内存暴涨,CPU100%的情况. 但是在查询了一通以后发现,这个时间没有人在运行报告,不知道是哪里有问题,没有回收... 所以决定定期在晚上没有不 ...
- qt 样式表基本用法
Qt样式表 QT样式表参考CSS层叠样式表设计,不同之处在于QT样式表应用于Widget世界. 可以使用QApplication::setStyleSheet()函数设置到整个应用程序上,也可以使用Q ...