Android提供了一個自定義的2D圖形庫來繪制圖像和圖像.在android.graphics.drawable包中你就可以找到這些用于2維繪畫的通用類.
本文讨論使用Drawable對象來作畫的基礎知識以及如何使用一對Drawable類的派生類.
Drawable是通常指的那種可以作畫的東西的抽象.你将發現Drawable類擴充出了很多特定的可繪圖形類,包括BitmapDrawable,ShapeDrawable,PictureDrawable,LayerDrawable,等等.當然,你也可以從它們派生出你自己的類來定義你自己的Drawable對象,當然以你獨有的方式來表現.
有三種方法來定義并執行個體化一個Drawable:使用一個儲存在你的項目資源中的圖像;使用一個定義了Drawable屬性的XML檔案;或使用普通的類對象構造方式.下面,我們将讨論前兩種方式(類對象構就是new出一個對象,傻子都知道,是以不說了).
從資源中的圖像建立
添加圖形到你的應用的一個簡單的方式是從你的項目資源中引用一個圖像檔案.支援的檔案格式有PNG(首選),JPG (可接受)和GIF(不推薦).此技術優先用于程式圖示,logo,或其它圖形,比如用于遊戲中的.
要使用一個圖像資源,隻需把你的檔案添加到項目的res/drawable/檔案夾下.從這裡,你可以在你的代碼或XMLlayout中引用它.不論從哪裡引用,推薦使用一個資源ID,它是不帶擴充名的檔案名(例如,my_image.png的ID是my_image).
注:圖像資源放在res/drawable/下,可能會在建構過程中自動被aapt工具無損壓縮以進行優化.例如,一個不需要超過256種顔色的真彩色PNG可能被轉換成一個帶有調色闆的8位PNG.這将造成保持圖像品質不變的情況下,占用更少的記憶體.是以要注意放在這個檔案夾下的圖像在建構期間可能會改變.如果你想把一個圖像作為比特流讀入以轉換成一個bitmap,那麼應把你的圖象放在res/raw/檔案夾下,在這裡他們不會被優化.
代碼例子
下面的代碼片段示範了如何使用drawable中的資源建立一個ImageView然後把它添加到layout:
LinearLayout mLinearLayout; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create a LinearLayout in which to add the ImageView mLinearLayout = new LinearLayout(this); // Instantiate an ImageView and define its properties ImageView i = new ImageView(this); i.setImageResource(R.drawable.my_image); i.setAdjustViewBounds(true); // 設定ImageView與Drawable的寬高比相同 i.setLayoutParams(new Gallery.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對象,然後用其中一個改變了一個屬性(比如alpha),那麼它将也影響到另一個.是以當處理一個圖像資源的多個執行個體時,你應該執行一個過渡動畫,而不是直接轉換Drawable.
XML例子
下面的XML片段示範了如何在XMLlayout中添加一個資源Drawable到一個ImageView.
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:tint="#55ff0000" android:src="@drawable/my_image"/>
從資源XML建立
現在,你應該熟悉了andriod下開發使用者界面的原則.是以,也了解了在XML中定義對象的強大和靈活性.此理念貫穿了Views到Drawables.如果你想建立一個Drawable對象,而它最初不是依賴于你應用代碼所定義的變量或userinteraction,那麼最好就去XML中定義這個Drawable.即使你希望你的Drawable在使用者使用過程中也可改變它的屬性,你也應該考慮在XML中定義對象,因為在它初始化後你也可以改變它的屬性.
一旦你在你的XML中定義了Drawable,就應把檔案儲存到項目的res/drawable/檔案夾下.然後,通過調用Resources.getDrawable()方法擷取并執行個體化這個對象,把你的XML檔案的資源ID傳給這個函數(見下面的例子).
任何支援inflate()方法的Drawable的子類都可以被定義在XML中并且被應用所執行個體化.每個支援XMLinflation的Drawable利用了特定的XML屬性來幫助定義對象的屬性(見類的的參考文檔來了解它們是什麼).見每個Drawable的子類的類描述文檔來了解如何在XML中定義.
例子
下面是一些定義TransitionDrawable的XML:
<transition xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/image_expand"> <item android: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);