1 先来看一下官方文档中的shape基本语法示例:
- 下面的示例代码中:integer, float , color 表示对应属性的取值类型
["rectangle" | "oval" | "line" | "ring"]
,像这种用中括号括起来的并用 | 间隔的,表示当前属性可以取的值是其中的任意一个
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=["rectangle" | "oval" | "line" | "ring"] >
<corners
android:radius="integer"
android:topLeftRadius="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer" />
<gradient
android:angle="integer"
android:centerX="float"
android:centerY="float"
android:centerColor="integer"
android:endColor="color"
android:gradientRadius="integer"
android:startColor="color"
android:type=["linear" | "radial" | "sweep"]
android:useLevel=["true" | "false"] />
<padding
android:left="integer"
android:top="integer"
android:right="integer"
android:bottom="integer" />
<size
android:width="integer"
android:height="integer" />
<solid
android:color="color" />
<stroke
android:width="integer"
android:color="color"
android:dashWidth="integer"
android:dashGap="integer" />
</shape>
2 详细解析
(1)shape根节点
1)根节点使用shape,其属性主要有:
android:shape
- 表示通过当前shape定义出一个什么形状,
- 取值有四种,分别是: rectangle 矩形, oval 椭圆,ring 环形 ,line 线
以下几个属性只有在shape取值是ring(环形)时有效
android:innerRadius
- 环形的内半径,
- 单位dp,也可以直接引用dimensions中定义的dp值
android:innerRadiusRatio
- 环形的内半径
- 取值float,
- 注意,
- 这里的ratio比率是相对于当前屏幕的宽度来说的,比如,
android:innerRadiusRatio="5"
,就表示环形的内半径是当前屏幕宽度的1/5 - innerRadius 和innerRadiusRatio两个属性都是控制环的内半径,所以,要么都不指定,要么同时只指定一个;如果都不指定的话,默认取innerRadiusRatio,值3,也就是说,此时内半径是屏幕宽度的1/3
- 这里的ratio比率是相对于当前屏幕的宽度来说的,比如,
android:thickness
- 表示环的厚度,
- 单位dp,也可以直接引用dimensions中定义的dp值
android:thicknessRatio
- 环形的内半径
- 取值float,
- 注意,
- 这里的ratio比率是相对于当前屏幕的宽度来说的,比如,
android:thicknessRatio="5"
,就表示环形的厚度是当前屏幕宽度的1/5 thickness
和thicknessRatio
两个属性都是控制环的厚度,所以,要么都不指定,要么同时只指定一个;如果都不指定的话,默认取thicknessRatio
,值9,也就是说,此时环的厚度是屏幕宽度的1/9
- 这里的ratio比率是相对于当前屏幕的宽度来说的,比如,
android:useLevel
- 取值类型Boolean.
- 通常取false,如果想显示ring(环形)也必须设置为false,如果不设置false,将无法显示ring(同时,如果想显示ring还要设置solid固定色或者gradient渐变色。如果不设置颜色,默认背景透明,还是看不见)
- 如果要将当前shape作为 LevelListDrawable 就需要设置为true。(截止到目前我没用过true)
2)shape根节点中又包含如下几个子节点:
- corners 圆角 (该属性只针对shape取值为rectangle时有效)
- gradient 渐变色(形状中的颜色渐变)
- solid 填充色/固定色
- stroke 边线(就是形状最边缘的描线)
- size 尺寸大小(一般不用定义)
- padding 内容距shape边界的距离(即边距。注意,因shape一般用做背景,所以这里的内容指的是以shape为背景的控件。用的比较少)
注意:
- solid 和gradient一般只使用一个,因为如果在代码中同时定义了solid和gradient,后定义的会覆盖先定义的一个。
(2)shape的子节点
1)corners 圆角
- 只有当根节点的shape取值是rectangle时有效
属性有五个,分别是:
- radius 全部角的半径
- android:topLeftRadius 左上角的半径
- android:topRightRadius 右上角的半径
- android:bottomLeftRadius 左下角的半径
- android:bottomLeftRadius 右下角的半径
取值单位 dp ,可以直接赋值,也可以引用dimensions中的值
一般要么使用radius直接定义全部角的半径,要么就分别控制四个角的半径
2)solid 填充色/固定色
属性只有一个color,可以直接赋给它十六进制的颜色值(如#ff0000),也可以引用color文件中的颜色值
3)stroke 边线
属性如下:
android:width
- 边线的厚度
- 单位dp,可以直接赋值,也可以引用dimensions中的值
android:color
- 边线的颜色
- 可以取16进制的颜色值,也可以引用color文件中的值
android:dashWidth
- 将边线分段,每条线段的宽度(也就是虚线)
- 单位dp ,可以直接赋值,也可以引用dimensions中的值
android:dashGap
- 线段与线段之间的间距
- 单位dp ,可以直接赋值,也可以引用dimensions中的值
4)gradient 渐变色
可以设置渐变的颜色,以及渐变的类型(线性渐变,放射渐变,扫描渐变)
主要属性有:
android:type
- 渐变的类型
- 取值有
- linear 线性渐变,默认的渐变类型
- radial 放射渐变,必须配合 android:gradientRadius 一起用
- sweep 扫描性渐变
android:angle
- 渐变的角度,只有线性渐变时才有效,
- 取值integer,且必须是45的倍数,默认是0,0表示从左到右渐变,45表示从左下到右上,90表示从下到上,135 右下到左上,180 从右到左,225 右上左下, 270 上下 ,315 左上右下 ,360同 0
android:centerX
- 渐变中心的相对X轴坐标,radial放射渐变时才有效,
- 取值float,且在0.0到1.0之间,默认为0.5,表示在正中间
android:centerY
- 渐变中心的相对Y轴坐标,radial放射渐变时才有效,
- 取值float,且在0.0到1.0之间,默认为0.5,表示在正中间
android:gradientRadius
- 渐变的半径,只有渐变类型为radial时才使用,而且必须使用
- 取值float
android:startColor
起始时的颜色android:endColor
结束时的颜色android:centerColor
起始和结束中间的过渡颜色
- 以上三个颜色可以取16进制的颜色值,也可以引用color文件中的值
参考:官方文档–shape