小編閱讀後達到的成效與待加強地方:
- 對Drawable有了更加全面的認知,每種Drewable都能熟練的使用
- 待加強對自定義Drawable的瞭解
Drawable在Android開發中最常見的,可能大家最熟悉的就是ShapeDrawable,StateListDrawable一個狀態,一形狀的,其實還有幾種
影象不清晰的請移步,下載原Xmind同時以下所有型別的例子都在github上有demo可以兩者結合閱讀
先看下相應的demo圖
BitmapDrawable
表示一張圖片 語法:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:antialias="true"
android:dither="true"
android:filter="true"
android:gravity="top|bottom|left|right|center_vertical|fill_vertical|center_horizontal
|fill_horizontal|center|fill|clip_vertical|clip_horizontal"
android:src="@drawable/image"
android:mipMap="true"
android:tileMode="clamp|disabled|repeat|mirror">
</bitmap>
複製程式碼
屬性 | 介紹 |
---|---|
android:src | 圖片的id |
android:antialias | 是否圖片抗鋸齒功能 |
android:dither | 是否開啟抖動效果 |
android:filter | 是否過濾效果 |
top | 將內部的Drawable放在容器的頂部,不改變其大小,如果為豎直裁剪,則從底部開始裁剪 |
bottom | 將內部的Drawable放在你容器的底部,不改變其大小。如為豎直裁剪,則從頂部開始裁剪 |
left | 將內部的Drawable放在容器的左邊,不改變其大小。如為水平裁剪,則從右邊開始後裁剪 |
right | 將內部的Drawable放在容器的右邊,不改變其大小。如為豎直裁剪,則從左邊開始裁剪 |
center_vertical | 將內部的Drawable放在容器的豎直中心,不改變其大小,如為豎直裁剪,那麼上下同時開始裁剪 |
fill_vertical | 將內部的Drawable在豎直方向向上填充容器, 如果為豎直裁剪,那麼僅當ClipDraewable的等級為0(0表示ClipDrawable被完全裁剪)時才有裁剪行為 |
center_horizontal | 使內部的Drawable在容器中水平居中,不改變它的大小,如果為水平裁剪,那麼從左右兩邊同時開始裁剪 |
fill_horizontal | 使內部的Drawable在水平方向上填充容器,如果為水平裁剪,那麼僅當ClipDrawable的等級為0時,才會有裁剪行為 |
center | 使內部的Drawable在容器中水平和豎直方向都居中,不改變其大小,如果為豎直裁剪,那麼從上下同時開始裁剪;如果為水平裁剪,那麼從左右同時裁剪 |
fill | 是內部的Drawable在水平和豎直方向上同時填充容器。僅當ClipDrawable的等級為0時,才能有裁剪行為 |
android:mipMap | 影象相關的處理技術,紋理對映 |
android:tileMode | 平鋪模式 |
ShapeDrawable
ShapeDrawable是一種通過顏色構造的圖形,既可以是純色的圖形,也可以是漸變效果圖形。 語法:
<?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="10dp"
android:topLeftRadius="5dp"
android:topRightRadius="5dp"
android:bottomLeftRadius="5dp"
android:bottomRightRadius="5dp"/>
<gradient
android:angle="45"
android:centerX="5px"
android:centerY="5px"
android:centerColor="@color/colorAccent"
android:endColor="@color/colorPrimary"
android:startColor="@color/colorPrimaryDark"
android:gradientRadius="5dp"
android:type="linear|radial|sweep"
android:useLevel="true"/>
<padding
android:left="5dp"
android:top="5dp"
android:right="5dp"
android:bottom="5dp"/>
<solid
android:color="@color/colorPrimaryDark"/>
<size
android:width="40dp"
android:height="40dp"/>
<stroke
android:width="40dp"
android:color="@color/colorAccent"
android:dashGap="4dp"
android:dashWidth="4dp"/>
</shape>
複製程式碼
相應屬性解釋:
屬性 | 介紹 |
---|---|
android:shape | 圖形的形狀:rectangle(矩形),oval(橢圓),line(橫線),ring(圓形),預設值矩形; |
特有屬性:
屬性 | 介紹 |
---|---|
android:innerRadius | 圓環的內半徑 |
android:thickness | 圓環厚度 |
android:innerRadiusRatio | 內半徑佔整個Drawable寬度的比例,預設為9 |
android:thicknessRatio | 厚度佔整個Drawable寬度的比例,預設為3 |
android:useLevel | 一般都是false,當在LevelListDrawable(文章後期會介紹)中使用 |
特有屬性(用px)
屬性 | 介紹 |
---|---|
android:radius | 四個角設定相同的角度 |
android:topLeftRadius | 設定最上角的角度 |
android:topRightRadius | 設定右上角的角度 |
android:bottomLeftRadius | 設定最下角的角度 |
android:bottomRightRadius | 設定右下角的角度 |
屬性(漸變效果):與(純色填充)標籤相互排斥
屬性 | 介紹 |
---|---|
android:angle | 漸變角度,預設為0,其值必須為45的度數,0表示從左到右,90表示從下到上 |
android:centerX | 漸變的中心點的橫座標 |
android:centerY | 漸變的中心點的縱座標,漸變的中心點,漸變的中心點會影響漸變的具體效果 |
android:startColor | 漸變的起始色 |
android:centerColor | 漸變的中間色 |
android:endColor | 漸變的結束色 |
android:gradientRadius | 漸變半徑,僅當android:type="radial"時有效 |
android:useLevel | 一般為fasle,當Drawable作為StateListDrawable(後面會有詳細介紹)使用時為true |
android:type | 漸變的類別,有liner(有線性漸變),radial(徑向漸變),sweep(掃描漸變),預設值為線性漸變 |
純色填充
屬性 | 介紹 |
---|---|
android:color | 填充的顏色 |
Shape的描邊
屬性 | 介紹 |
---|---|
android:width | 描邊的寬度 |
android:color | 描邊的顏色 |
android:dashWidth | 組成虛線的線段寬度 |
android:dashGap | 組成虛線的線段之間的間隔,間隔越大則虛線之間的空隙越大 |
屬性 :android:left .android:top ,android:right ,android:bottom 屬性:android:width ,android:height
LayerDrawable
LayerDrawable對應的XML標籤,表示一種層次化的Drawable集合,將不同的Drawable放置在不同的層上從而達到一種疊加後的效果。 語法:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="40dp"
android:drawable="@drawable/image"
android:left="40dp"
android:right="40dp"
android:top="40dp" />
</layer-list>
複製程式碼
其中android:top,android:bottom,android:left,android:right表示四周的偏移量
StateListDrawable
StateListDrawable對應 標籤,表示Drawable集合,每個Drawable都對應著View的一種狀態,根據View的狀態選擇相應的Drawable; 語法:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize="true"
android:dither="true"
android:variablePadding="true">
<item android:drawable="@drawable/image"
android:state_activated="true"
android:state_checkable="true"
android:state_checked="true"
android:state_enabled="true"
android:state_focused="true"
android:state_hovered="true"
android:state_pressed="true"
android:state_selected="true"
android:state_window_focused="true" />
</selector>
複製程式碼
相應的屬性詳解:
屬性 | 介紹 |
---|---|
android:constantSize | StateListDrawable的固定大小是否隨著其狀態的改變而改變,預設為false |
android:dither | 是否開啟抖動效果,預設值為true |
android:variablePadding | StateListDrawable 的padding表示是否隨著其狀態的改變而改變,預設值false |
android:state_pressed | 表示按下狀態 |
android:state_focused | 表示View已經獲得焦點 |
android:state_selected | 表示使用者選擇了View |
android: state_checked | 表示使用者選中了View |
android:state_enabled | 表示View當前處於可用狀態 |
LevelListDrawable
LevelListDrawable對應於標籤,表示一個Drawable集合,集合中每個Drawable都有等級,根據不同的等級,LevelListDrawable會切換為對應的Drawable 語法:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/image"
android:maxLevel="20"
android:minLevel="10" />
<item
android:drawable="@drawable/image1"
android:maxLevel="9"
android:minLevel="1" />
</level-list>
複製程式碼
maxLevel,minLevel設定等級最大最小值,會根據程式碼設定的相應的level切換相應的drawable
###TransitionDrawable TransitionDrawable對應於標籤,實現Drawable之間的淡入淡出效果 語法:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:width="40dp"
android:height="40dp"
android:bottom="40dp"
android:drawable="@drawable/image"
android:top="40dp" />
</transition>
複製程式碼
其中android:top,android:bottom,android:left,android:right表示四周的偏移量
InsetDrawable
InsetDrawable對應標籤,可以將其他Drawable內嵌到自己當中,並且四周留出一定的邊界。 語法:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/image"
android:insetBottom="40dp"
android:insetLeft="40dp"
android:insetRight="40dp"
android:insetTop="40dp" />
複製程式碼
其中android:top,android:bottom,android:left,android:right表示四周的偏移量
ScaleDrawable
ScaleDrawable對應的標籤為,可以根據自己的等級(level)將指定的Drawable縮放到一定比例。 語法:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/image"
android:scaleGravity="top|bottom|left|right|center_vertical|fill_vertical|center_horizontal
|fill_horizontal|center|fill|clip_vertical|clip_horizontal"
android:scaleHeight="50%"
android:scaleWidth="50%" />
複製程式碼
android:scaleGravity等同於androiid:gravity,android:scaleHeight和android:scaleWidth分別表示對指定Drawable寬高的縮放比例,用百分比表示。
ClipDrawable
ClipDrawable對應於標籤,根據自己的等級(level)來裁剪另一個Drawable,裁剪的方向根據屬性android:clipOrientation和android:gravity兩個屬性共同決定的。其中clipOrientation表示裁剪方向,分為水平(horizontal)和豎直(vertical)方向
語法:
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:clipOrientation="horizontal|vertical"
android:drawable="@drawable/image"
android:gravity="top|bottom|left|right|center_vertical|fill_vertical|center_horizontal
|fill_horizontal|center|fill|clip_vertical|clip_horizontal" />
複製程式碼
選項 | 意義 |
---|---|
top | 將內部的Drawable放在容器的頂部,不改變其大小,如果為豎直裁剪,則從底部開始裁剪 |
bottom | 將內部的Drawable放在你容器的底部,不改變其大小。如為豎直裁剪,則從頂部開始裁剪 |
left | 將內部的Drawable放在容器的左邊,不改變其大小。如為水平裁剪,則從右邊開始後裁剪 |
right | 將內部的Drawable放在容器的右邊,不改變其大小。如為豎直裁剪,則從左邊開始裁剪 |
center_vertical | 將內部的Drawable放在容器的豎直中心,不改變其大小,如為豎直裁剪,那麼上下同時開始裁剪 |
fill_vertical | 將內部的Drawable在豎直方向向上填充容器, 如果為豎直裁剪,那麼僅當ClipDraewable的等級為0(0表示ClipDrawable被完全裁剪)時才有裁剪行為 |
center_horizontal | 使內部的Drawable在容器中水平居中,不改變它的大小,如果為水平裁剪,那麼從左右兩邊同時開始裁剪 |
fill_horizontal | 使內部的Drawable在水平方向上填充容器,如果為水平裁剪,那麼僅當ClipDrawable的等級為0時,才會有裁剪行為 |
center | 使內部的Drawable在容器中水平和豎直方向都居中,不改變其大小,如果為豎直裁剪,那麼從上下同時開始裁剪;如果為水平裁剪,那麼從左右同時裁剪 |
fill | 是內部的Drawable在水平和豎直方向上同時填充容器。僅當ClipDrawable的等級為0時,才能有裁剪行為 |
初寫文章,大家請輕點噴
最後感謝剛哥的Android開發藝術探索