本文譯自:http://developer.android.com/guide/topics/graphics/2d-graphics.html
圖形繪製
Android為繪製圖形和圖片提供了一個定製的2D圖形類庫。android.graphics.drawable包中能夠找到用於繪製二維圖形的共同的類。
本文討論使用Drawable對象來繪製圖形的基礎知識,以及如何使用Drawable類的子類。關於使用Drawable對象來繪製幀動畫的資訊,請看繪製動畫文檔(http://developer.android.com/guide/topics/graphics/drawable-animation.html)
Drawable對象是對圖形繪製的一般化抽象,你會發現很多用於繪製特殊類型圖形的Drawable類的子類,包括BitmapDrawable、ShapDrawable、PictureDrawable、LayerDrawable等。當然,你也可以繼承這些類,來定義自己的具有獨特行為的Drawable對象。
有三種方法來定義和初始化一個Drawable對象:1.使用儲存在項目資源中的一個圖片;2.使用定義Drawable對象屬性的XML檔案;3.使用普通的類構造器。以下我們將重點討論前兩種技術(使用構造器技術對於開發人員來說並不陌生)。
從資源圖片中建立一個Drawable對象
通過引用項目資源中的一個圖片檔案,把圖形添加到應用程式中是一種簡單的方法。支援的圖片格式包括:PNG(推薦格式)、JPG(可接受格式)、GIF(不推薦格式)。這種技術主要用於應用的表徵圖、Logo或遊戲中所使用的那些圖形。
要使用圖片資源,只需把圖片添加到項目的res/drawable/目錄中。應用程式代碼或XML布局會從那兒來引用這些圖片。無論在那兒使用圖片,都要使用該圖片資源的ID,這個ID是不帶檔案類型副檔名的檔案名稱(如:my_image指向了my_image.png檔案)。
注意:被放置在res/drawable/目錄下的圖片資源,在編譯期間,能夠被aapt工具自動的最佳化壓縮成無損的圖片。例如,一個不多於256色的真彩色PNG圖片,能夠被轉換成一個帶有調色盤的8位PNG圖片。這樣就獲得同等品質的圖片,但卻需要更少的記憶體。因此,要瞭解放置在這個目錄下的圖片,在編譯期間的這種改變。如果為了把圖片轉換成一個位元影像,而計劃用位流的形式來讀取一張圖片,就要把該圖片放到res/raw/檔案夾中,這個檔案夾中的圖片不會被最佳化。
範例程式碼
以下程式碼片段示範了如何建立一個使用繪製資源圖片的ImageView對象,並把該對象添加到布局中:
LinearLayout mLinearLayout;
protectedvoid onCreate(Bundle
savedInstanceState){
super.onCreate(savedInstanceState);
// Create a LinearLayout in which to add the ImageView
mLinearLayout
=newLinearLayout(this);
// Instantiate an ImageView and define its properties
ImageView i
=newImageView(this);
i.setImageResource(R.drawable.my_image);
i.setAdjustViewBounds(true);//
set the ImageView bounds to match the Drawable's dimensions
i.setLayoutParams(newGallery.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
// Add the ImageView to the layout and set the layout as the content view
mLinearLayout.addView(i);
setContentView(mLinearLayout);
}
另一種情況,可能想要把圖片資源作為Drawable對象來處理,就要像下面代碼這樣來建立一個Drawable對象:
Resources res
= mContext.getResources();
Drawable myImage
= res.getDrawable(R.drawable.my_image);
注意:在項目中的每種資源只能保持一種狀態,不管執行個體化了多少該對象。例如:如果用同一個圖片資源來執行個體化了兩個Drawable對象,那麼只要改變了其中一個Drawable對象一個屬性(如,透明度),另一個也會受到影響。因此在處理一個圖片資源的多個執行個體時,要用補間動畫(tween animation)來替代直接的Drawable對象的傳遞。
樣本XML
以下XML片段顯示了如何把一個繪製資源添加到XML布局中的一個ImageView元素中:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:tint="#55ff0000"
android:src="@drawable/my_image"/>
關於使用項目資源的更多資訊,請看資源和資產文檔(http://developer.android.com/guide/topics/resources/index.html)
從資源XML中建立一個Drawable對象
現在,你應該已經熟悉了Android的使用者介面的開發原則。因此也就理解了定義XML中對象所帶來的強大功能和靈活性。這種方法從View對象到Drawable對象都適用。如果建立了一個Drawable對象,它初始並不依賴應用程式代碼或使用者介面中定義的一個變數,而是把它定義在一個XML中,這是一個好的選擇。即使是在使用者與應用程式互動期間要改變Drawable對象的屬性,也應該考慮把該對象定義在XML中,這樣一旦它被執行個體化,就可以隨時來修改它的屬性。
一旦用XML來定義Drawable對象,就要把該定義儲存在工程的res/drawable/目錄中,然後通過調用Resources.getDrawable()方法來擷取和執行個體化該對象。
任何提供了inflate()方法的Drawable子類都能夠被定義在XML中,並能夠被應用程式執行個體化。每個提供XML填充能力的Drawable對象,都採用了特殊的XML屬性來協助定義對象的屬性。有關每個Drawable子類如何在XML中定義的資訊,請看對應類文檔。
樣本
以下XML定義了一個TransitionDrawable對象:
<transitionxmlns:android="http://schemas.android.com/apk/res/android">
<itemandroid:drawable="@drawable/image_expand">
<itemandroid:drawable="@drawable/image_collapse">
</transition>
這個XML要儲存在res/drawable/expand_collapse.xml檔案中,以下代碼會樣本化該TransitionDrawable對象,並把它作為ImageView對象的內容來設定:
Resources res
= mContext.getResources();
TransitionDrawable transition
=(TransitionDrawable)
res.getDrawable(R.drawable.expand_collapse);
ImageView image
=(ImageView) findViewById(R.id.toggle_image);
image.setImageDrawable(transition);
然後,這個過渡效果能夠使用以下代碼來運行:
transition.startTransition(1000);