Android Drawable之GradientDrawable

原文出處:http://www.ccbu.cc/android/gradientdrawable

GradientDrawable可以在res/drawable目錄下以xml文件用<shape>標簽來定義??纯垂俜轿臋n給出的xml定義說明吧。

<?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是根元素,其屬性android:shape="rectangle"定義了shape的形狀為矩形。android:shape可選的參數(shù)包括“rectangle,oval,line和ring。當android:shape="ring"時,shape有以下一些屬性可用使用:

  • android:innerRadius
    尺寸。 內環(huán)的半徑。一個尺寸值(dip等等)或者一個尺寸資源。
  • android:innerRadiusRatio
    Float類型。這個值表示內部環(huán)的比例,例如,如果android:innerRadiusRatio = " 5 ",那么內部的半徑等于環(huán)的寬度除以5。這個值會被android:innerRadius重寫。 默認值是9。
  • android:thickness
    尺寸。環(huán)的厚度,是一個尺寸值或尺寸的資源。
  • android:thicknessRatio
    Float類型。厚度的比例。例如,如果android:thicknessRatio= " 2 ",然后厚度等于環(huán)的寬度除以2。這個值是被android:innerRadius重寫, 默認值是3。
  • android:useLevel
    Boolean類型。如果用在 LevelListDrawable里,那么就是true。如果通常不出現(xiàn)則為false。

下面一個一個的了解shape的各個子元素。

corners
<corners>表示的是矩形的四個角弧度,只能用在android:shape = "rectangle"的時候,可用的屬性包括:

<corners
    android:radius="integer"http://Dimension。圓角的半徑。會被下面每個特定的圓角屬性重寫。
    android:topLeftRadius="integer"http://Dimension。top-left 圓角的半徑。
    android:topRightRadius="integer"http://Dimension。top-right 圓角的半徑。
    android:bottomLeftRadius="integer"http://Dimension。 bottom-left圓角的半徑。
    android:bottomRightRadius="integer"http://Dimension。bottom-right圓角的半徑。
    />

gradient
<gradient>表示漸變顏色填充。

<gradient
    android:angle="integer"http://Integer 漸變的角度。0 代表從 left 到 right。90 代表bottom到 top。必須是45的倍數(shù),默認為0。
    android:centerX="integer"http://Float 漸變中心的相對X坐標,在0到1.0之間。
    android:centerY="integer"http://Float 漸變中心的相對Y坐標,在0到1.0之間。
    android:centerColor="integer"http://Color 可選的顏色值?;趕tartColor和endColor之間。
    android:endColor="color"http://Color 結束的顏色。
    android:gradientRadius="integer"http://Float 漸變的半徑。只有在android:type="radial"才使用。
    android:startColor="color"http://Color 開始的顏色值。
    android:type=["linear" | "radial" | "sweep"]//漸變的模式。
    android:useLevel=["true" | "false"] //Boolean。如果在LevelListDrawable中使用,則為true。
    />

其中android:type表示漸變的模式,可選的參數(shù)包括:

  • "linear" 線形漸變。這也是默認的模式
  • "radial" 輻射漸變。startColor即輻射中心的顏色
  • "sweep" 掃描線漸變。

padding
<padding>表示內容與視圖邊界的距離,屬性包括:

<padding
    android:left="integer"http://Dimension。左邊填充距離。
    android:top="integer"http://Dimension。頂部填充距離。
    android:right="integer"http://Dimension。右邊填充距離。
    android:bottom="integer"http://Dimension。底部填充距離。
    />

size
<size>表示shape的大小,屬性包括:

<size
    android:width="integer"http://Dimension。shape的高度。
    android:height="integer"http://Dimension。shape的寬度。
    />

solid
<solid>表示shape填充的顏色,與<gradient>的漸變功能一樣只是此處填充的是純色。所以一般情況下<gradient>和<solid>只用使用一個就行了。其屬性包括:

<solid
    android:color="color"http://Color。顏色值,十六進制數(shù),或者一個Color資源。
    />

stroke
<stroke>用來表示shape的邊框畫筆,當android:shape="line"的時候,必須設置該元素。

<stroke
    android:width="integer"http://Dimension。筆畫的粗細。
    android:color="color"http://Color。筆畫的顏色。
    android:dashWidth="integer"http://Dimension。每畫一條線的長度。只有當 android:dashGap也設置了才有效。
    android:dashGap="integer"http://Dimension。每畫一條線就間隔多少。只有當android:dashWidth也設置了才有效。
    />

好了,下面我們用GradientDrawable來實現(xiàn)一個自定義的數(shù)字輸入鍵盤。此處仿iphone的鎖屏節(jié)目的圓形數(shù)字輸入按鈕。正常狀態(tài)下,是一個有邊框,中間透明圓環(huán),按下時,中間填充顏色。
先實現(xiàn)按鈕的正常狀態(tài),在res/drawable下創(chuàng)建number_button_normal.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
    <solid
        android:color="@android:color/transparent"
        />
    <padding
        android:left="4dp"
        android:top="4dp"
        android:right="4dp"
        android:bottom="4dp"
        />
    <stroke
        android:width="1dp"
        android:color="#df1ea353"
        />
</shape>

再定義按下狀態(tài),number_button_press.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
    <solid
        android:color="#1ea353"
        />
    <padding
        android:left="15dp"
        android:top="0dp"
        android:right="15dp"
        android:bottom="0dp"
        />
    <stroke
        android:width="1dp"
        android:color="#df1ea353"
        />
</shape>

正常狀態(tài)和按下狀態(tài)都有了,我們用他們來實現(xiàn)一個簡單的按鈕的背景吧,和平時我們自定義按鈕一樣,通過selector來進行定義。在res/drawable目錄下創(chuàng)建number_button.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/number_button_press"/>
    <item android:drawable="@drawable/number_button_normal"/>
</selector>

OK,萬事具備,就差應用到按鈕了。ok,我們創(chuàng)建一個layout文件如下。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_gravity="center_horizontal"
    android:gravity="center">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp">
        <Button
            style="@style/number_button"
            android:id="@+id/nkb_1"
            android:text="1"/>
        <Button
            style="@style/number_button"
            android:id="@+id/nkb_2"
            android:text="2"/>
        <Button
            style="@style/number_button"
            android:id="@+id/nkb_3"
            android:text="3"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <Button
            style="@style/number_button"
            android:id="@+id/nkb_4"
            android:text="4"/>
        <Button
            style="@style/number_button"
            android:id="@+id/nkb_5"
            android:text="5"/>
        <Button
            style="@style/number_button"
            android:id="@+id/nkb_6"
            android:text="6"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <Button
            style="@style/number_button"
            android:id="@+id/nkb_7"
            android:text="7"/>
        <Button
            style="@style/number_button"
            android:id="@+id/nkb_8"
            android:text="8"/>
        <Button
            style="@style/number_button"
            android:id="@+id/nkb_9"
            android:text="9"/>
    </LinearLayout>
    <Button
        style="@style/number_button"
        android:id="@+id/nkb_0"
        android:text="0"/>
</LinearLayout>

此處,說一個小小的技巧,因為此處有10個按鈕,每個按鈕的樣式都是一樣的,所以,我給按鈕建了一個樣式,在要應用的地方直接使用style="@style/number_button"制定樣式就行了,看看樣式把。按鈕樣式定義在res/values/styles.xml中。

    <style name="wrap_wrap">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
    </style>

    <style name="number_button" parent="wrap_wrap">
        <item name="android:background">@drawable/login_passwd_btn</item>
        <item name="android:textColor">#333333</item>
        <item name="android:textSize">@dimen/login_passwd_btn_text_size</item>
        <item name="android:minHeight">60dp</item>
        <item name="android:minWidth">60dp</item>
        <item name="android:layout_marginLeft">8dp</item>
        <item name="android:layout_marginRight">8dp</item>
        <item name="android:layout_marginBottom">8dp</item>
    </style>

好了,看看效果吧


device-2016-11-14-221948.png

device-2016-11-14-222001.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,366評論 25 708
  • XML bitmap XML 位圖是在 XML 中定義的資源,指向位圖文件。實際上是原始位圖文件的別名。XML 可...
    李建彪閱讀 1,848評論 0 3
  • 更多Android總結知識點 Android中的13種Drawable小結 Android的八種對話框的實現(xiàn) An...
    侯蛋蛋_閱讀 4,172評論 0 5
  • 概述 今天我們來探究一下android的樣式。其實,幾乎所有的控件都可以使用 background屬性去引用自定義...
    CokeNello閱讀 5,130評論 1 19
  • 給自己找虐,離開一個后期較舒適的公司,前期較艱難的時期已經走過,看不到后期的發(fā)展,只是會比較安穩(wěn),有時候感覺...
    原來915閱讀 269評論 0 0

友情鏈接更多精彩內容