Clip Drawable
一个定义在XML中的Drawable对象,根据当前的level值来得到一个Drawable的截取片段。你可以通过level值来控制控制得到的Drawable的宽和高,也可以指定Drawable在容器中的gravity属性。该类Drawable通常用于进度条的实现。
文件路径:res/drawable/filename.xml 文件名就是对应的资源ID
编译过的资源类型: ClipDrawable
资源引用:
- JAVA中: R.drawable.filename
- XML中: @[package:]drawable/filename
语法
<?xml version="1.0" encoding="utf-8"?>
<clip
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:clipOrientation=["horizontal" | "vertical"]
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"] />
元素:
< clip > 定义了Clip Drawable,必须作为根节点存在。
属性:
- xmlns:android
String类型. 定义了 XML 的命名空间,必须为”http://schemas.android.com/apk/res/android“。
android:drawable
Drawable资源,必须,指向一个待裁剪的drawable。android:clipOrientation
关键属性,指定了Drawable的裁剪方向。
必须为下面的值之一:
值 | 属性 |
---|---|
horizontal | 横向裁剪Drawable |
vertical | 纵向裁剪Drawable |
- android:gravity
关键属性,指定了从哪里开始裁剪Drawable。
必须为下面的一个或者多个(使用|分隔)属性:
值 | 属性 |
---|---|
top | 把对象置于容器顶部,不改变其大小。当clipOrientation值为”vertical”时,从底部开始裁剪 |
bottom | 把对象置于容器底部,不改变其大小。当clipOrientation值为”vertical”时,从顶部开始裁剪 |
left | 把对象置于容器左侧,不改变其大小。当clipOrientation值为”horizontal”时,从右侧开始裁剪,默认值。 |
right | 把对象置于容器左侧,不改变其大小。当clipOrientation值为”horizontal”时,从左侧开始裁剪。 |
center_vertical | 把对象置于容器垂直居中方向,不改变其大小。裁剪方式同 “center” 的相同 |
fill_vertical | 如果有需要的话,充满容器的垂直方向,当clipOrientation值为”vertical”时,不会有裁剪发生,因为Drawable已经充满了垂直方向(除非level值为0,此时为不可见状态。) |
center_horizontal | 把对象置于容器水平居中方向,不改变其大小。裁剪方式同 “center” 的相同 |
fill_horizontal | 如果有需要的话,充满容器的水平方向,当clipOrientation值为”horizontal”时,不会有裁剪发生,因为Drawable已经充满了水平方向(除非level值为0,此时为不可见状态。) |
center | 把对象置于容器的居中位置,不改变其大小,当clipOrientation值为”horizontal”时,从左至右裁剪,当clipOrientation值为”vertical”时,从上至下裁剪。 |
fill | 如果有需要的话,充满整个容器。不会有裁剪发生,因为Drawable已经充满了整个容器(除非level值为0,此时为不可见状态。) |
clip_vertical | 附加选项,裁剪子元素的上边界和/或下边界到容器的边界。此时裁剪基于vertical gravity:顶部的gravity裁剪底部边界,底部的gravity裁剪顶部边界,两者都不存在的两侧同时裁剪。 |
clip_horizontal | 附加选项,裁剪子元素的左边界和/或右边界到容器的边界。此时裁剪基于horizontal gravity:左侧的gravity裁剪右边界,右侧的gravity裁剪左边界,两者都不存在的两侧同时裁剪。 |
示例:
该文件保存在res/drawable/clip.xml:
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/android"
android:clipOrientation="horizontal"
android:gravity="left" />
下面展示如何把定义的drawable用于一个View
<ImageView
android:id="@+id/image"
android:background="@drawable/clip"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
下面的代码会增加图片的裁剪宽度:
ImageView imageview = (ImageView) findViewById(R.id.image);
ClipDrawable drawable = (ClipDrawable) imageview.getDrawable();
drawable.setLevel(drawable.getLevel() + 1000);
增加level的值会增加裁剪量而使得图片慢慢展示出来,下面是7000时的样子:
说明:默认level是0,这是完全裁剪,图像是不可见的。当level为10000时,图像不会被裁剪,完全可见。
也可以参考:
Scale Drawable
一个定义在XML中的Drawable对象,根据当前的level值来得到一个改变大小的Drawable。
文件路径:res/drawable/filename.xml 文件名就是对应的资源ID
编译过的资源类型: ScaleDrawable
资源引用:
- JAVA中: R.drawable.filename
- XML中: @[package:]drawable/filename
语法
<?xml version="1.0" encoding="utf-8"?>
<scale
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"]
android:scaleHeight="percentage"
android:scaleWidth="percentage" />
元素:
< scale > 定义了Scale Drawable,必须作为根节点存在。
属性:
- xmlns:android
String类型. 定义了 XML 的命名空间,必须为”http://schemas.android.com/apk/res/android“。
android:drawable
Drawable资源,必须,指向一个待裁剪的drawable。android:scaleGravity
关键属性,指定了Drawable的缩放之后的位置。
必须为下面的一个或者多个(使用|分隔)属性:
值 | 属性 |
---|---|
top | 把对象置于容器顶部,不改变其大小。 |
bottom | 把对象置于容器底部,不改变其大小。 |
left | 把对象置于容器左侧,不改变其大小。默认值。 |
right | 把对象置于容器左侧,不改变其大小。 |
center_vertical | 把对象置于容器垂直居中方向,不改变其大小 |
fill_vertical | 如果有需要的话,充满容器的垂直方向。 |
center_horizontal | 把对象置于容器水平居中方向,不改变其大小。 |
fill_horizontal | 如果有需要的话,充满容器的水平方向。 |
center | 把对象置于容器的居中位置,不改变其大小。 |
fill | 如果有需要的话,充满整个容器。 |
clip_vertical | 附加选项,裁剪子元素的上边界和/或下边界到容器的边界。此时裁剪基于vertical gravity:顶部的gravity裁剪底部边界,底部的gravity裁剪顶部边界,两者都不存在的两侧同时裁剪。 |
clip_horizontal | 附加选项,裁剪子元素的左边界和/或右边界到容器的边界。此时裁剪基于horizontal gravity:左侧的gravity裁剪右边界,右侧的gravity裁剪左边界,两者都不存在的两侧同时裁剪。 |
android:scaleHeight
百分比。高度缩放比,值的格式为XX%。例如:100%,12.5%,等。android:scaleWidth
百分比。宽度缩放比,值的格式为XX%。例如:100%,12.5%,等。
示例:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/logo"
android:scaleGravity="center_vertical|center_horizontal"
android:scaleHeight="80%"
android:scaleWidth="80%" />
也可以参考:
Shape Drawable
一个定义在XML中的通用形状。
文件路径:res/drawable/filename.xml 文件名就是对应的资源ID
编译过的资源类型: GradientDrawable
资源引用:
- JAVA中: R.drawable.filename
- XML中: @[package:]drawable/filename
语法
<?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="integer"
android:centerY="integer"
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 > 定义了Shape Drawable,必须作为根节点存在。
属性:
xmlns:android
String类型. 定义了 XML 的命名空间,必须为”http://schemas.android.com/apk/res/android“。android:shape
关键属性。定义了形状的类型,可以使用的属性有:
值 | 属性 |
---|---|
rectangle | 充满View的矩形。这是默认的形状。 |
oval | 同View尺寸相适应的椭圆。 |
line | 同容器水平方向相同的线,需要通过< stroke >元素来指定线的宽度 |
ring | 圆形。 |
下面的属性只用于 android:shape=”ring”时:
android:innerRadius
Dimension类型。 内圆的半径大小。android:innerRadiusRatio
Float类型。 内圆半径大小比。例如, 如果android:innerRadiusRatio=”5”, 那么内圆半径等于外圆的宽度除以5。该属性被android:innerRadius重写。 默认值是9。android:thickness
Dimension类型. 圆的线宽。android:thicknessRatio
Float类型。 圆的线宽比。例如,如果android:thicknessRatio=”2”, 那么线宽等于外圆的宽度除以2. 该属性被android:innerRadius重写。默认值是3。android:useLevel
Boolean类型。 “true”表示作为一个LevelListDrawable来使用。该值通常为flase,否则你的形状可能无法显示。
< corners >
添加圆角边,只适用于长方形。
属性:
android:radius
Dimension类型。所有方向的边角的半径,重写了以下4个角的属性。android:topLeftRadius
Dimension类型。左上方角的半径。android:topRightRadius
Dimension类型。右上方角的半径。android:bottomLeftRadius
Dimension类型。左下方角的半径。android:bottomRightRadius
Dimension类型。右下方角的半径。
备注:每个角的半径(最初)应大于1,或者不指定该属性。如果你想指定不规则的圆角形状,一个解决方法是指定一个默认角的半径大于1,然后为每一个你想指定的角指定半径,对于不想要圆角的边,指定为0(0dp)。
< gradient >
对形状指定一个色值梯度。
属性:
android:angle
Integer类型。色彩渐变的角度,0表示从左至右, 90表示从下至上。必须为45的倍数。默认值为0。android:centerX
Float类型。相对中点的渐变点x坐标(0 - 1.0)。android:centerY
Float类型。相对中点的渐变点y坐标(0 - 1.0)。android:centerColor
Color类型。开始和结束之间的可选颜色,一个十六进制的值或颜色的资源。android:endColor
Color类型。结束颜色,一个十六进制的值或颜色的资源。android:gradientRadius
Float类型.。颜色梯度的半径,只适用于android:type=”radial”。android:startColor
Color类型。开始颜色,一个十六进制的值或颜色的资源。android:type
关键属性。 梯度模式应用的类型。有效值为:
值 | 属性 |
---|---|
linear | 线性梯度。默认值。 |
radial | 径向梯度。开始颜色为中心颜色。 |
sweep | 扫线梯度。 |
- android:useLevel
Boolean类型。”true”表示作为一个LevelListDrawable来使用。
< padding >
属性:
指定容器内的padding值(在容器内的padding值,而非Shape Drawable本身的)。
android:left
Dimension类型。 左padding,dimension值或者dimension资源。android:top
Dimension类型。 上padding,dimension值或者dimension资源。android:right
Dimension类型。 右padding,dimension值或者dimension资源。android:bottom
Dimension类型。 下padding,dimension值或者dimension资源。
< size >
形状的大小。
属性:
android:height
Dimension类型。 形状的高度,dimension值或者dimension资源。android:width
Dimension类型。 形状的宽度,dimension值或者dimension资源。
说明:默认情况下,会按照定义的数值来缩放自身以同容器大小相适配。当你在ImageView中使用shape时,可以通过指定android:scaleType为”center”来限制缩放。
< solid >
形状的填充色
属性:
- android:color
Color类型。用于形状的填充颜色,一个十六进制的值或颜色的资源。
< stroke >
形状的边缘线
属性:
- android:width
Dimension类型。线的宽度,dimension值或者dimension资源。 android:color
Color类型。线的颜色,一个十六进制的值或颜色的资源。android:dashGap
Dimension类型。虚线之间的距离,只有当设置了android:dashWidth时有效,dimension值或者dimension资源。android:dashWidth
Dimension类型。虚线的长度,只有当设置了android:dashGap时有效,dimension值或者dimension资源。
示例:
该文件保存在res/drawable/gradient_box.xml:
<?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>
下面展示如何把定义的drawable用于一个View
<TextView
android:background="@drawable/gradient_box"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
下面的系统代码得到了一个shape drawable并将其用于一个view
Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);
TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);
也可以参考: