1. 程式人生 > >Android的Drawable分類和使用詳解

Android的Drawable分類和使用詳解

一、前言

最近在看關於Android的書籍,發現居然把Drawable當做一個章節來講,感覺沒有必要啊,Drawable不就是圖片引用嗎。深入理解後才發現我們平常用的只是比較常用和簡單的,Drawable還是有很多其他實現方式的。今天就詳細講解一下Drawable。

二、概述

其實Drawable的種類有很多,常見的有BitmapDrawable、ShapeDrawable、LayerDrawable、StateListDrawable。下面詳細講解一下Drawable的各個使用方式

1、BitmapDrawable

開發中基本不使用,因為我們在控制元件呼叫圖片時直接通過src或者background的方式就直接引用圖片了,而bitmapDrawable是對圖片進行重新描述和定義,如果圖片沒有特殊情況不會多此一舉的,下面講一下具體用法。

Drawable 下新建bitmap.xml:是對需要的圖片進行重新定義

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/material_item_background"
    android:tileMode="mirror"
    android:antialias="true"
    android:filter="true"
    android:dither="true">
</bitmap>

(1)android:antialias:表示是否開啟抗鋸齒功能,一般為true;

(2)android:dither:表示是否開啟抖動,一般為true;

(3)android:filter:表示是否開啟過濾效果,一般為true;

(4)android:tileMode:表示是否平鋪模式 ,disable預設不平鋪;repeat表示水平和豎直方向的平鋪;mirror表示水平和豎                                             直方向的鏡面投影效果,clamp

表示四周影象會擴充套件到周圍區域。

使用自定義的bitmap方式

    <ImageView
        android:layout_width="wrap_content"
        android:src="@drawable/my_bitmap"
        android:layout_height="wrap_content" />

2、ShapeDrawable

ShapeDrawable可以實現矩形、圓形、線和圓環;它既可以是純色的圖形,也可以是漸變色的圖形

(1)程式碼效果圖如下

(2)實現程式碼:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <!--畫圖角度-->
    <corners
        android:radius="20dp"
        android:topLeftRadius="10dp"
        android:topRightRadius="20dp"
        android:bottomLeftRadius="20dp"
        android:bottomRightRadius="40dp" />
    <!--描邊-->
    <stroke
        android:width="2dp"
        android:color="@color/black"
        android:dashWidth="5dp"
        android:dashGap="2dp" />
    <!--漸變效果-->
    <gradient
        android:angle="45"
        android:centerX="0"
        android:centerY="0"
        android:centerColor="@color/gray_background"
        android:endColor="@color/red"
        android:gradientRadius="0"
        android:startColor="@color/black"
        android:type="linear"
        android:useLevel="true"/>
    <!--表示距離框架的空白-->
    <padding
        android:left="@dimen/px_50"
        android:top="@dimen/px_50"
        android:right="@dimen/px_50"
        android:bottom="@dimen/px_50"/>
<!--大小-->
    <size android:width="100dp"
        android:height="100dp"/>
</shape>

1、shape

根元素,其android:shape屬性定義了這個xml檔案定義的形狀,可以是retangle(矩形),oval(橢圓),line 和 ring(圓環)。

2、corners(角)

<corners>表示的是矩形的四個角,只能用在android:shape = "rectangle" 的時候,一般情況下就是用來實現圓角矩形的效果

3、stroke(描邊)

android:dashWidth:組成虛線的線段的寬度
android:dashGap="2dp":組成虛線的線段之間的間隔
4、gradient(漸變)

android:angle:漸變的角度,預設為0,其值必須是45的倍數

android:centerX:漸變中心點的橫座標

android:startColor:漸變的起始顏色,還有中間色和結束色

android:gradientRadius:漸變半徑

android:type:漸變類別;line(線性漸變)、radial(徑向漸變)sweep(掃描漸變)

5、solid(填充)

表示純色填充

6、padding

表示包含它的view的空白

7、size

圖片大小

3、LayerDrawable

表示多個圖片疊加形成的新的圖片,可以實現的效果圖如下:

(2)實現程式碼

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/default_picture"
        android:gravity="center"
        android:id="@+id/layer_1"/>

    <item
        android:drawable="@drawable/default_picture"
        android:gravity="center"
        android:top="50dp"
        android:left="50dp"
        android:id="@+id/layer_2"/>

    <item
        android:drawable="@drawable/default_picture"
        android:gravity="center"
        android:top="100dp"
        android:left="100dp"
        android:id="@+id/layer_3"/>
</layer-list>

4、StateListDrawable

比較常用,也是一個Drawable集合,會根據View的點選狀態來顯示不同的圖片,最常見的就是button按鈕點選,對應標籤是<selector>

(1)實現效果

(2)實現程式碼

<?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/building_info_connnect" />
    <!--  觸控時並且沒有獲得焦點狀態 -->
    <item android:state_pressed="true"  android:drawable="@drawable/nim_slide_toggle_off" />
    <!--選中時的圖片背景-->
    <item android:state_selected="true" android:drawable="@drawable/nim_slide_toggle_on" />
    <!--獲得焦點時的圖片背景-->
    <item android:state_focused="true" android:drawable="@drawable/top_background" />
    <!-- 視窗沒有處於互動時的背景圖片 -->
    <item android:drawable="@drawable/building_info_report" />
</selector>

5、LevelListDrawable

表示一個Drawable,將每個Drawable設定為各個等級,根據設定的等級顯示不同的圖片,標籤為<level-list>

6、TransitionDrawable

表示兩個Drawable的淡入淡出效果,標籤為<transition>,可以在當頁面顯示後的指定時間顯示另一張圖片,效果圖如下。

(2)實現程式碼如下,首先在Drawable資料夾下建立一個xml

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/xuan_chaun"/>
    <item android:drawable="@drawable/default_picture"/>
</transition>

(3)在自己的佈局中使用該drawable

    <TextView
        android:id="@+id/imgView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="@drawable/transition_layout" />

(4)還需要在Activity中進行載入

 imgView=findViewById(R.id.imgView);
        TransitionDrawable drawable=(TransitionDrawable)imgView.getBackground();
        drawable.startTransition(2000);

三、總結

我們一般在使用圖片時只需要直接引用drawable就可以,但是可以使用ShapeDrawable來實現一些例如圓形、矩形、漸變色等背景色的實現,這樣可以減少APK的大小。

如果需要實現多個圖片疊加感覺佈局麻煩就使用<layer-list>;

如果涉及到按鈕點選顯示不同的效果,就用<selector>,

如果在頁面中某個圖片顯示完成後還需要顯示另一張圖片,可以使用<transition>,避免了在頁面中寫定時器功能了。