在Android开发中,使用shape可以很方便的帮我们画出我们想要的背景,相对于png等图片来说,使用shape可以减少安装包大小,而且能够更好的适配不同的手机;
Shape属性 官网
下面是官网的示范
<?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>
<shape> 形状可绘制对象,这必须是根元素
xmlns:android="http://schemas.android.com/apk/res/android" ---->定义XML的命名空间
android:shape ---> 定义形状的类型,其有效值是:
值 | 描述 | 效果 |
---|---|---|
android:shape="rectangle" | 填充包含视图的矩形,这也是默认形状 | |
android:shape="oval" | 适应包含视图尺寸的椭圆形状,定义宽高后可称为圆形 | |
android:shape="line" | 跨越包含视图宽度的水平线。此形状需要<stroke>元素定义线宽,虚线和实线 | |
android:shape="ring" | 环形 |
注意:仅当 android:shape="ring" 时才能使用以下属性:
1. android:innerRadius ---->尺寸,环内部(中间的孔)的半径
2.android:innerRadiusRatio ---> 浮点型,环的厚度,以环宽度的比例表示。如android:innerRadiusRatio = "5",则内半径等于环宽度除以5,此值被android:innerRadius覆盖,默认值是9。
3.android:thickness -->尺寸,环的厚度。
4.android:thicknessRatio--->浮点型,环的厚度,表示为环宽度的比例,如android:thicknessRatio="2",则厚度等于宽度除以2,此值被android:innerRadius覆盖,默认值为3。
5.android:useLevel--->布尔值,如果这用作LevelListDrawable,则此值为“true”。通常应为“false”,或者形状不会显示。
六个基本节点属性(corners、gradient、padding、size、solid、stroke)
1、<corners> : 为形状产生圆角,仅当android:shape="rectangle"时适用
corners节点下的属性和描述:
属性 | 描述 |
---|---|
android:radius | 尺寸。矩形四个角的半径,以尺寸值和尺寸资源(@dimens)表示,会被以下属性覆盖对应的位置。 |
android:topLeftRadius | 尺寸。左上角的半径,以尺寸和尺寸资源表示 |
android:topRightRadius | 尺寸。右上角的半径 |
android:bottomLeftRadius | 尺寸。左下角的半径 |
androoid:bottomRightRight | 尺寸。右下角的半径 |
注:(最初)必须为每个角提供大于1的角半径,否则无法产生圆角。如果希望特定角不要倒圆角,解决方法是使用android:radius设置大于1的默认角半径,然后使用实际所需的值替换每个角,为不希望倒圆角的角提供零(“0dp”)
2、<gradient> : 指定形状的渐变颜色
gradient的属性和描述
属性 | 描述 |
---|---|
android:angle | 整型。渐变的角度(读)。0为从左到右,90为从上到下,必须是45的倍数,默认为0 |
android:centerX | 浮点型。渐变中心的相对X轴的位置(0 -- 1.0) |
android:centerY | 浮点型。渐变中心的相对Y轴的位置(0 -- 1.0) |
android:centerColor | 颜色。起始颜色与结束颜色之间的可选颜色,以十六进制或颜色资源表示 |
android:startColor | 起始颜色 |
android:endColor | 结束颜色 |
android:gradientRadius | 渐变的半径。仅在android:type="radial时适用 |
android:type | 关键字。要应用的渐变图案的类型 |
android:useLevel | 布尔值。如果这用作LevelListDrawable,则此值为"true" |
android:type关键字说明 | |
---|---|
值 | 说明 |
android:type="linear" | 线性渐变。这是默认值 |
android:type="radial" | 径向渐变。起始颜色为中心颜色 |
android:type="sweep" | 流线型渐变 |
3、<padding> : 要应用到包含视图元素的内边距(这会填充视图内容的位置,而非形状)
padding的属性和描述
属性 | 描述 |
---|---|
android:left | 左内边距 |
android:top | 上内边距 |
android:right | 右内边距 |
android:bottom | 下内边距 |
4、<size> : 形状的大小
size的属性和描述
属性 | 描述 |
---|---|
android:height | 形状的高度 |
androud:width | 形状的宽度 |
5、<solid> : 用于填充形状的纯色
solid的属性和描述
属性 | 描述 |
---|---|
android:color | 颜色。应用于填充形状的颜色 |
6、<stroke> : 形状的笔画中线
stroke的属性和描述
属性 | 描述 |
---|---|
android:width | 尺寸,线的宽度 |
android:color | 颜色。线的颜色 |
android:dashGap | 尺寸。短划线的间距,仅设置了android:dashWidth有效 |
android:dashWidth | 尺寸。每个短划线的大小,仅在设置了android:dashGap有效 |
示例
1.新建Shape文件
首先在res/drawable文件夹下,new --> Drawable resource file ,新建一个文件,命名为:shape_bg.xml(名称随意,自己定,理解就行),注意Root element选择为shape:内容:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#FFFF0000"
android:endColor="#80FF00FF"
android:angle="45"/>
<padding android:left="7dp"
android:top="7dp"
android:right="7dp"
android:bottom="7dp" />
<corners android:radius="8dp" />
</shape>
2.XML布局中将shape应用到视图中
既然定义了shape文件,肯定就要使用,下面将其设置为TextView的背景
<TextView
android:background="@drawable/shape_bg"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/textview"/>
代码获取Shape,并应用到视图中:
Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);
TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);