目录
概述
笔者认为,android应用UI设计应该从容大方,简洁优雅,应尽量避免繁琐多余的形状线条。因此笔者建议使用shape
自定义View控件的外观。
建议理由:shape
只能自定义简单形状和颜色填充,然而却有完美的边缘渲染,不会出现边缘锯齿或者模糊的廉价感,这一点对于android UI是十分重要的。并且shape
的操作和使用都十分简单。
操作过程为先在drawable
目录下创建根节点为shape
的.xml
资源文件,之后在具体View控件中使用android:background=@drawable/targetshape
将绘制的图形设置为View控件背景即可。
子元素与属性
android:shape属性
此属性必须全局声明,用来指定图形的形状基础。属性值:
rectangle
:属性默认值,形状基础为矩形。
oval
:形状基础为椭圆。
ring
:形状基础为圆环。
line
:形状基础为直线。
solid
solid子元素用于指定图形填充色。属性:
android:color
属性值可以是RGB888
格式,不指定透明度,例如:android:color="#ff00ff"
;也可以是ARGB
格式,即在RGB888
格式的基础上添加透明度值(Alpha),十六进制下的高两位指定透明度,例如:android:color="#50ff00ff"
。
size
size子元素用于指定图形的宽高。属性:
android:width
android:height
此子元素不可用于line
和ring
。
用于oval
时,它的两个属性中一个指定长轴长,另一个指定短轴长。
corners
corners子元素指定矩形四个角的圆角半径。属性:
android:radius
:同时指定四个角度圆角半径。
android:topLeftRadius
:单独指定左上角圆角半径。
android:topRightRadius
:单独指定右上角圆角半径。
android:bottomLeftRadius
:单独指定左下角圆角半径。
android:bottomRightRadius
:单独指定右下角圆角半径。
此子元素只能用于矩形形状基础。
stroke
stroke子元素指定形状的描边。常用属性:
android:width
:指定描边宽度。
android:color
:指定描边颜色。可用RGB888
和ARGB
。
gradient
gradient子元素指定颜色渐变。属性:
android:type
:指定渐变类型,属性值有:linear
(线性渐变)、radial
(径向渐变)、sweep
(扫描渐变)。
android:startColor
:渐变的开始颜色。
android:centerColor
:渐变的中间颜色。
android:endColor
:渐变的结束颜色。
android:angle
:渐变方向角,属性值必须是45的整数倍。只对线性渐变有效。
android:gradientRadius
:渐变半径,只对径向渐变有效。
android:centerX
:X方向的渐变中心位置,属性值为0.0到1.0,0.0表示图形最左,1.0表示图形最右。
android:centerY
:Y方向的渐变中心位置,属性值为0.0到1.0,0.0表示图形最下,1.0表示图形最上。
颜色的渐变经历:startColor
TocenterColor
ToendColor
。
gradient
的颜色将覆盖solid
的颜色。
padding
padding子元素用于设置内边距,即内容(比如文字)与边缘的距离。
line
line可以绘制直线和虚线。由于种种原因,笔者放弃了解。
ring
ring的尺寸属性必须全局声明。
常用属性
android:innerRadius
:圆环内径。
android:thickness
:圆环厚度。
android:useLevel
:只有此属性值为false
形状才会显示。
代码示例
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring"
android:innerRadius="100dp"
android:thickness="20dp"
android:useLevel="false">
<gradient
android:type="sweep"
android:startColor="#0000ff"
android:endColor="#ff0000" />
</shape>
效果如下图:
动态修改shape颜色
假如Button
使用shape绘制的图形作为背景,那么在Java代码中动态修改颜色的方法为:
Button btn_1=(Button)findviewById(R.id.btn_1);
GradientDrawable grd_1=btn_1.getBackground();
grd_1.setColor(0x50ff00ff);
还可以使用setAlpha()
方法动态设置透明度。
欢迎指正