1. Android的样式一般定义在res/values/styles.xml文件中,其中有一个根元素<resource>,而具体的每种样式定义则是通过<resource>下的子标签<style>来完成,<style>通过添加多个<item>来设置样式不同的属性.

样式是可以继承的,可通过<style>标签的parent属性声明要继承的样式,也可通过点前缀 (.) 继承,点前面为父样式名称,后面为子样式名称。点前缀方式只适用于自定义的样式,若要继承Android内置的样式,则只能通过parent属性声明。

    <!--继承AppTheme-->
<style name="styleTest" parent="AppTheme">
<item name="android:textColor">#ff3300</item>
</style>
<!--继承styleTest-->
<style name="styleTest.styleTheme" >
<item name="android:textSize">30sp</item>
</style>

可以通过在具体的ui组件里面调用style="@style/styleTest", 也可以把该样式当作主题在AndroidManifest.xml的Activity或整个Application设置android:theme="@style/styleTest"

2. shape

对于各种矩形、圆形、椭圆、线等可以通过shape标签画图,用shape定义的xml文件存放在drawable目录下。

shape可以自定义形状,可以定义下面四种类型的形状,通过android:shape属性指定:

  • rectangle: 矩形,默认的形状
  • oval: 椭圆形
  • line: 线形,可以画实线和虚线
  • ring: 环形,可以画环形进度条

通过shap里面的子选项元素控制填充颜色、边距、圆角、描边等。

a. rectangle

solid: 设置形状填充的颜色

padding: 设置内容与形状边界的内间距

gradient: 设置形状的渐变颜色

android:type 渐变的类型

  • linear 线性渐变,默认的渐变类型
  • radial 放射渐变,设置该项时,android:gradientRadius也必须设置
  • sweep 扫描性渐变
  • android:startColor 渐变开始的颜色
  • android:endColor 渐变结束的颜色
  • android:centerColor 渐变中间的颜色
  • android:angle 渐变的角度,线性渐变时才有效,必须是45的倍数,0表示从左到右,90表示从下到上
  • android:centerX 渐变中心的相对X坐标,放射渐变时才有效,在0.0到1.0之间,默认为0.5,表示在正中间
  • android:centerY 渐变中心的相对X坐标,放射渐变时才有效,在0.0到1.0之间,默认为0.5,表示在正中间
  • android:gradientRadius 渐变的半径,只有渐变类型为radial时才使用
  • android:useLevel 如果为true,则可在LevelListDrawable中使用

corners: 设置圆角,只适用于rectangle类型,可分别设置四个角不同半径的圆角,当设置的圆角半径很大时,比如200dp,就可变成弧形边了

stroke: 设置描边,可描成实线或虚线。

  • android:color 描边的颜色
  • android:width 描边的宽度
  • android:dashWidth 设置虚线时的横线长度
  • android:dashGap 设置虚线时的横线之间的距离

b.oval

用来画椭圆

size: 设置形状默认的大小,可设置宽度和高度

  • android:width 宽度
  • android:height 高度

c. line

画线时,有几点特性必须要知道的:

  1. 只能画水平线,画不了竖线;
  2. 线的高度是通过stroke的android:width属性设置的;
  3. size的android:height属性定义的是整个形状区域的高度;
  4. size的height必须大于stroke的width,否则,线无法显示;
  5. 线在整个形状区域中是居中显示的;
  6. 线左右两边会留有空白间距,线越粗,空白越大;
  7. 引用虚线的view需要添加属性android:layerType,值设为"software",否则显示不了虚线。

d. ring

shape根元素有些属性只适用于ring类型:

  • android:innerRadius 内环的半径
  • android:innerRadiusRatio 浮点型,以环的宽度比率来表示内环的半径,默认为3,表示内环半径为环的宽度除以3,该值会被android:innerRadius覆盖
  • android:thickness 环的厚度
  • android:thicknessRatio 浮点型,以环的宽度比率来表示环的厚度,默认为9,表示环的厚度为环的宽度除以9,该值会被android:thickness覆盖
  • android:useLevel 一般为false,否则可能环形无法显示,只有作为LevelListDrawable使用时才设为true
<!--矩形-->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#e1bee7"></solid>
<padding android:bottom="5dp" android:left="5dp" android:right="5dp" android:top="5dp"></padding>
<corners android:radius="8dp"></corners>
</shape>

3. selector

针对不同的状态,比如按钮按下,checkbox选中等都需要不同的样式处理, 可以通过selector的state_xxx属性设置。

selector标签,可以添加一个或多个item子标签,而相应的状态是在item标签中定义的。定义的xml文件可以作为两种资源使用:drawable和color。作为drawable资源使用时,一般和shape一样放于drawable目录下,item必须指定android:drawable属性;作为color资源使用时,则放于color目录下,item必须指定android:color属性。

状态:

  • android:state_enabled: 设置触摸或点击事件是否可用状态,一般只在false时设置该属性,表示不可用状态
  • android:state_pressed: 设置是否按压状态,一般在true时设置该属性,表示已按压状态,默认为false
  • android:state_selected: 设置是否选中状态,true表示已选中,false表示未选中
  • android:state_checked: 设置是否勾选状态,主要用于CheckBox和RadioButton,true表示已被勾选,false表示未被勾选
  • android:state_checkable: 设置勾选是否可用状态,类似state_enabled,只是state_enabled会影响触摸或点击事件,而state_checkable影响勾选事件
  • android:state_focused: 设置是否获得焦点状态,true表示获得焦点,默认为false,表示未获得焦点
  • android:state_window_focused: 设置当前窗口是否获得焦点状态,true表示获得焦点,false表示未获得焦点,例如拉下通知栏或弹出对话框时,当前界面就会失去焦点;另外,ListView的ListItem获得焦点时也会触发true状态,可以理解为当前窗口就是ListItem本身
  • android:state_activated: 设置是否被激活状态,true表示被激活,false表示未激活,API Level 11及以上才支持,可通过代码调用控件的setActivated(boolean)方法设置是否激活该控件
  • android:state_hovered: 设置是否鼠标在上面滑动的状态,true表示鼠标在上面滑动,默认为false,API Level 14及以上才支持
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--radio选中时的样式-->
<item android:state_checked="true">
<layer-list>
<!-- 红色背景 -->
<item>
<color android:color="#E4007F"></color>
</item>
<!-- 白色背景 -->
<item android:bottom="3dp" android:drawable="@android:color/white"></item>
</layer-list>
</item>
<!--默认的样式-->
<item>
<layer-list>
<!-- 红色背景 -->
<item>
<color android:color="#E4007F" />
</item>
<item android:bottom="1dp" android:drawable="@android:color/white"></item>
</layer-list>
</item>
</selector>

4.layer-list

layer-list可以将多个drawable按照顺序层叠在一起显示. 见selector代码。

参考:

http://keeganlee.me/post/android/20150830

http://keeganlee.me/post/android/20150905

http://keeganlee.me/post/android/20150909

http://keeganlee.me/post/android/20151031

android 样式开发的更多相关文章

  1. 浅谈Android样式开发之布局优化

    引言 今天我们来谈一下Android中布局优化常用的一些手段.官方给出了3种优化方案,分别是</include>.</viewstub>.</merge>标签,下面 ...

  2. [转]Android样式的开发:shape篇

    转载自Keegan小钢原文链接:http://keeganlee.me/post/android/20150830 Android样式的开发:shape篇Android样式的开发:selector篇A ...

  3. Android 样式的开发(转)

    Android(2)    目录(?)[-] rectangle oval line ring layer-list篇 普通图片 bitmap标签 点九图片 nine-patch标签 color标签 ...

  4. 125、Android样式的开发(转载)

    Android样式的开发:drawable汇总篇 http://android.jobbole.com/82117/Android样式的开发:layer-list篇 http://android.jo ...

  5. Android样式的开发:shape篇

    转载请注明:转载自Keegan小钢并标明原文链接:http://keeganlee.me/post/android/20150830微信订阅号:keeganlee_me写于2015-08-30 And ...

  6. 【读书笔记《Android游戏编程之从零开始》】7.Android 游戏开发常用的系统控件(Dialog)

    在Android应用开发中,Dialog(对话框)创建简单且易于管理因而经常用到,对话框默认样式类似创建样式的Activity.首先介绍android.app.AlertDialog下的Builder ...

  7. 【读书笔记《Android游戏编程之从零开始》】5.Android 游戏开发常用的系统控件(ProgressBar、Seekbar)

    3.7 ProgressBar ProgressBar类官方文档地址:http://developer.android.com/reference/android/widget/ProgressBar ...

  8. 使用Android Studio搭建Android集成开发环境(图文教程)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  9. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

随机推荐

  1. 前端工程之模块化(来自百度FEX)

    模块化 是一种处理复杂系统分解成为更好的可管理模块的方式,它可以把系统代码划分为一系列职责单一,高度解耦且可替换的模块,系统中某一部分的变化将如何影响其它部分就会变得显而易见,系统的可维护性更加简单易 ...

  2. EMS-keil C51常用错误

    1. LAB100.C(12): error C216: subscript on non-array or too many dimensions 原程序如下: #include <reg51 ...

  3. 【HDOJ】1276 士兵队列训练问题

    初看这道题目很像尤瑟夫问题, 区别是每次都是从1开始.解法也很类似.数学解递推公式.假定第K次报数后,余下人数不超过3个人.若第K次为1-3报数,那么由这三个数的当前索引n可推上一次报数之前的编号为n ...

  4. 【HDOJ】1547 Bubble Shooter

    两次BFS,一次扫描关联点.一次扫描可能掉落的情况(即再次扫描所有非爆炸的联通点).余下未被扫描的点均爆炸. #include <cstdio> #include <cstring& ...

  5. UVA138 Street Numbers(数论)

    题目链接. 题意: 找一个n,和一个m(m < n),求使得1~m的和等于m~n的和,找出10组m,n 分析: 列出来式子就是 m*(m+1)/2 = (n-m+1)*(m+n)/2 化简后为 ...

  6. 第一个Windows程序

    今天,我们的任务就是和大家一起开发第一个Windows程序,这个程序的功能非常简单,就是弹出一个对话框,但是简单的程序可以帮助大家建立信心. 例1 第一个Windows程序 /* ********** ...

  7. jsp+servlet 上传图片实例

    最近,在弄android小程序,现在需要做一个服务器后端,这里我下载了一个商城源码,想添加商品图片,这里在网上找了一个实例 引用: http://blog.csdn.net/shuwei003/art ...

  8. 解读sample5

    说明 被测试代码文件 sample1.h.sample1.cc和sample3-inl.h 测试代码文件 sample5_unittest.cc 官网上如是描述sample5: Sample #5 i ...

  9. [转]Java Daemon Startup Script

    How to start a Java program as a Linux daemon with an /etc/init.d script. See also: http://www.sourc ...

  10. 《算法问题实战策略》-chaper14-整数论

    Lucas定理: 在组合计数问题中,我们常面临组合数C(n,m)过大而无法直接计算的困境,那么这里的Lucas定理给出了一个较大组合数进行取余运算的一种递归算法. 什么是Lucas定理? Lucas定 ...