在工作中通常会遇到很多UI的问题,特别是当看到设计稿的时候,这个对话框是圆角的,背景还是渐变的!截图的话略占包大小。使用shape可以替换大部分图片,极大的减小包size。
注:我很懒,各个shape代码的效果图就留给读者去实现了。
先简单介绍下这几个类型,以及如何创建这几个类型的Shape
android:shape="rectangle"
四边形
示例:黄色的四边形 solid属性是指定图形的填充色
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ffff00"/>
shape>
android:shape="oval"
椭圆
示例:如果设置width和height高度一样,那么就是圆形了
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#ffff00"/>
<size android:width="20dp"
android:height="20dp"/>
shape>
android:shape="line"
直线
基本不用
android:shape="ring"
圆环
示例:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring"
android:innerRadius="10dp"
android:thickness="10dp"
android:useLevel="false">
<solid android:color="#ffff00"/>
shape>
效果图:
注意:android:useLevel 只有当我们的shape使用在LevelListDrawable中的时候,这个值为true,否则为false。当shape为ring的时候必须设置这个属性为false
android:innerRadius 内环的半径
android:thickness 环的厚度,也就是外环半径-内环半径
android:innerRadiusRatio; 默认值为3,内环半径的比例,例如这个值=2,那么内环的半径就是环的宽度1/2,通常这个值都会大于2,否则就显示不全环了,可以被android:innerRadius覆盖
android:thicknessRatio:如果android:thicknessRatio=”2”,那么环的厚度就等于环的宽度除以2。可以被android:thickness覆盖的
在shape标签下还有5个标签是给shape设置其他属性的,shape的填充颜色,边角等
就是Shape的
android:radius=""
android:topLeftRadius=""
android:topRightRadius=""
android:bottomLeftRadius=""
android:bottomRightRadius=""
后面4个属性会覆盖radius属性,比如下面这个四边形,它的左上圆角半径就是5,右上圆角半径是20,其他的左下和右下的圆角半径就是50:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ffff00"/>
<corners
android:topLeftRadius="5dp"
android:topRightRadius="20dp"
android:radius="50dp"/>
shape>
left,top,right,bottom四个属性
同控件里的padding
width,height
通常shape都是作为background的,所以这个size通常不会有效,而是控件的宽高为准,当然,当作为imageview的src的时候,这个size默认还是会有用的
渐变应该是这所有属性里最复杂,也最有用的一个属性了,比较复杂的可以使用shape实现的图形基本都会用到这个属性
1.默认的startColor可能为白色也可能是黑色~不同的手机默认不同
2.默认的渐变type为linear
3.radial的渐变类型必须要添加属性android:gradientRadius;
属性说明表格:所属type列是这个属性必须在gradient属性值为这列值的时候这个属性才有效
属性 | 属性值类型 | 属性说明 | 所属type(linear,radial,sweep ) |
---|---|---|---|
android:startColor=”“ | color | 开始渐变颜色 | all |
android:endColor=”“ | color | 结束渐变的颜色 | all |
android:centerColor=”“ | color | 中间颜色 | all |
android:centerX=”“ | float | 渐变中心x的相对位置 0-1 | radial,sweep |
android:centerY=”“ | float | 渐变中心y的相对位置 0-1 | radial,sweep |
android:useLevel=”“ | boolean | 默认false,建议false | |
android:angle=”“ | int | 渐变开始角度,必须是45的倍数 | linear |
android:type=”“ | linear,radial,sweep | 线性渐变(默认)/放射渐变/扫描式渐变 | |
android:gradientRadius=”“ | dp | 渐变半径 | radial |
linear示例:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ffffff"/>
<gradient
android:startColor="#ff00ff"
android:endColor="#00ffff"
android:angle="90"
android:type="linear"/>
shape>
效果图:
sweep示例:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ffffff"/>
<gradient
android:startColor="#ff00ff"
android:endColor="#00ffff"
android:type="sweep"
android:angle="270"
android:centerX="0.2"
android:centerY="0.2"/>
shape>
效果图:
radial示例:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ffffff"/>
<gradient
android:startColor="#ff00ff"
android:endColor="#00ffff"
android:type="radial"
android:gradientRadius="50dp"
android:centerX="0.5"
android:centerY="0.5"/>
shape>
效果图:
思考: android:useLevel true和false对渐变的影响?
属性 | 属性值类型 | 属性说明 |
---|---|---|
android:width=”“ | dp | 描边厚度 |
android:color=”“ | color | 描边的颜色 |
android:dashWidth=”“ | dp | 将描边分为多个dash,每隔dash块的宽度 |
android:dashGap=”“ | dp | dash块的间隔 |
示例:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#0f0"/>
<stroke
android:width="10dp"
android:color="#ff00ff"
android:dashWidth="10dp"
android:dashGap="1dp">stroke>
shape>
效果图
1.solid属性可能会被gradient覆盖,如下,solid的颜色无效
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#fff"/>
<gradient
android:startColor="#ff00ff"
android:endColor="#00ffff"
android:type="radial"
android:gradientRadius="100"
android:centerX="0.3"
android:centerY="0.3"
android:useLevel="false"/>
shape>
2.stoke和gradient不冲突
3.shape标签的其他内部属性
android:visible=""
可见性,true, false,好像没什么用
android:dither=""
http://blog.csdn.net/superjunjin/article/details/7670864
android:tint=""
着色,就是在已有的图形上在覆盖一层颜色(简单理解)。会覆盖solid属性
android:tintMode=""
api21才有,通常不使用
xmlns:android=""
。。。。