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時,圖像不會被裁剪,完全可見。

也可以參考:


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,必須作爲根節點存在。

屬性:

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

也可以參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章