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>,避免了在頁面中寫定時器功能了。