Drawable Resources Part III(Drawable 资源 第三部分)

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时,图像不会被裁剪,完全可见。

也可以参考:

  • ClipDrawable

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%" />

也可以参考:

  • ScaleDrawable

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);

也可以参考:

  • ShapeDrawable

你可能感兴趣的:(resources,scale,shape,clip,drawable对象)