一、如何建立一個BitmapDrawable對象
Bitmap,代表一個位元影像映像,Android支援三種格式的位元影像映像:.png (preferred),.jpg (acceptable), .gif (discouraged)。
括弧裡的說明,代表這三種格式的圖片在Android中的支援情況,.png格式圖片優先,.jpg格式也可以,但是效果沒有.png好,.gif支援最差。
可以直接使用圖片的名稱作為資源ID,來直接引用一個位元影像圖片。也可以再XML檔案中建立一個資源別名的ID。
在構建應用的時候,Bitmap檔案可能會被appt工具壓縮自動最佳化為無損映像。例如,一個真彩色PNG,不需要超過256的顏色可以被轉換成一個8位PNG和調色盤。這將導致一個映像品質相同,但這需要更少的記憶體。所以要意識到,在drawable目錄中映像的二進位檔案在構建程式時可以改變。如果你打算讀一個映像作為位元組流並將它轉換成一個位元影像,把你的圖片放在在res /raw/檔案夾裡,在那裡他們不會被最佳化。
1、通過Bitmap File
一個bitmap檔案就是一個.png、.jpg,.gif格式的檔案。Android會對儲存在res/drawable/目錄下的這些檔案建立一個Drawable資源。
檔案位置:
res/drawable/filename.png
(.png
,
.jpg
, or .gif
) 檔案名稱即資源的ID。
編譯資源資料類型:
指向BitmapDrawable類型的指標。
資源引用:
-
In Java:
R.drawable.filename
In XML:
@[package:]drawable/filename
-
樣本:
-
有這樣儲存的圖片
res/drawable/myimage.png
,在layout xml檔案中將他顯示在視圖上。
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/myimage" />
在java代碼中檢索出為一個Drawable對象。
-
Resources res=getResources(); Drawable drawable = res.getDrawable(R.drawable.myimage); //實際上這是一個BitmapDrawable對象 BitmapDrawable bitmapDrawable=(BitmapDrawable)drawable; //可以在調用getBitmap方法,得到這個位元影像 Bitmap bitmap=bitmapDrawable.getBitmap();
-
參考:
-
- 2D Graphics
BitmapDrawable
2、通過XML Bitmap
一個XML bitmap是一個在XML檔案中定義的指向一個bitmap檔案的資源。其效果是作為一個原始位元影像檔案的別名,並且可以指定一些額外的屬性。
注意:你可以在<item>節點中使用<bitmap>作為它的子節點。比如,當你定義一個state list或者layer list的時候,可以包括一個android:drawable
屬性
Note: You can use a <bitmap>
element as a child of an<item>
element. Forexample, when creating astate list orlayer list,you can exclude the
android:drawable
attribute from an<item>
element and nest a<bitmap>
inside it that defines the drawable item.
-
檔案位置:
-
res/drawable/filename.xml
filename作為資源的ID
-
編譯資源類型
-
指向BitmapDrawable類型的指標
-
資源引用
-
In Java:
R.drawable.filename
In XML:
@[package:]drawable/filename
-
文法:
-
<?xml version="1.0" encoding="utf-8"?><bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@[package:]drawable/drawable_resource" android:antialias=["true" | "false"] android:dither=["true" | "false"] android:filter=["true" | "false"] android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" | "fill_vertical" | "center_horizontal" | "fill_horizontal" | "center" | "fill" | "clip_vertical" | "clip_horizontal"] android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
-
節點介紹:
-
-
<bitmap>
-
定義位元影像的來源和屬性
屬性:
-
xmlns:android
-
類型:String。定義了XML的命名空間,必須是"http://schemas.android.com/apk/res/android"。如果<bitmap>是根項目,那麼他是必須的,如果是嵌套在<itme>裡面,那麼就不是必須的。
-
android:src
-
類型:Drawable resource。必需。 引用一個drawableresource.
-
android:antialias
-
類型:Boolean。是否開啟消除鋸齒。
-
android:dither
-
類型:Boolean。如果位元影像與螢幕的像素配置不同時,是否允許抖動.(例如:一個位元影像的像素設定是 ARGB 8888,但螢幕的設定是RGB 565)
-
android:filter
-
類型:Boolean。是否允許對位元影像進行濾波。對位元影像進行收縮或者延展使用濾波可以獲得平滑的外觀效果。
-
android:gravity
-
類型:關鍵字。定義位元影像的重力(gravity),如果位元影像小於其容器,使用重力指明在何處繪製
必需是下面的屬性,多個之間用 | 分隔
Value |
Description |
top |
Put the object at the top of its container, not changing its size. |
bottom |
Put the object at the bottom of its container, not changing its size. |
left |
Put the object at the left edge of its container, not changing its size. |
right |
Put the object at the right edge of its container, not changing its size. |
center_vertical |
Place object in the vertical center of its container, not changing its size. |
fill_vertical |
Grow the vertical size of the object if needed so it completely fills its container. |
center_horizontal |
Place object in the horizontal center of its container, not changing its size. |
fill_horizontal |
Grow the horizontal size of the object if needed so it completely fills its container. |
center |
Place the object in the center of its container in both the vertical and horizontal axis, notchanging its size. |
fill |
Grow the horizontal and vertical size of the object if needed so it completely fills itscontainer. This is the default. |
clip_vertical |
Additional option that can be set to have the top and/or bottom edges of the child clipped toits container's bounds. The clip is based on the vertical gravity: a top gravity clips thebottom edge, a bottom gravity clips the top edge, and neither clips both edges. |
clip_horizontal |
Additional option that can be set to have the left and/or right edges of the child clipped toits container's bounds. The clip is based on the horizontal gravity: a left gravity clipsthe right edge, a right gravity clips the left edge, and neither clips both edges. |
-
android:tileMode
-
類型:Keyword。
-
定義了tile模式。當tile模式被啟用,位元影像是重複的,並且gravity屬性將被忽略。
必須是下列之一常量值:
Value |
Description |
disabled |
Do not tile the bitmap. This is the default value. |
clamp |
Replicates the edge color if the shader draws outside of its original bounds |
repeat |
Repeats the shader's image horizontally and vertically. |
mirror |
Repeats the shader's image horizontally and vertically, alternating mirror images so thatadjacent images always seam. |
-
樣本:
-
<?xml version="1.0" encoding="utf-8"?><bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon" android:tileMode="repeat" />
-
參考:
-
BitmapDrawable
- Creatingalias resources
二、BitmapDrawable的使用
一個BitmapDrawable就是封裝了一個位元影像。直接以檔案的方式,就是封裝了一個原始的位元影像。以Xml方式,可以對原始的位元影像進行一系列的處理,比如說消除鋸齒,展開,對齊等等。
要瞭解BitmapDrawable的使用,還需要明白Bitmap、BitmapFactory等類。Bitmap代表了一個原始的位元影像,並且可以對位元影像進行一系列的變換操作。BitmapFactory提供一系列的方法用於產生一個Bitmap對象。多用在Canvas中。
關於繪圖和位元影像變換以後再學習。BitmapDrawable的使用比較簡單,就是在其他的xml檔案中直接引用就可以了,不過要注意在xml中定義BitmapDrawable各個屬性使用和含義。