Android圖形系統中Drawable使用詳解打賞

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:

[java] 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);
}
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對象:

[java] Resources res = mContext.getResources();
Drawable myImage = res.getDrawable(R.drawable.my_image);
Resources res = mContext.getResources();
Drawable myImage = res.getDrawable(R.drawable.my_image);
注:不管有多少不同的對象實例化它,你項目中的每個唯一的資源只能保持一種狀態.例如,如果你從同一個圖像資源實例化了兩個Drawable對象,然后用其中一個改變了一個屬性(比如alpha),那么它將也影響到另一個.所以當處理一個圖像資源的多個實例時,你應該執行一個過渡動畫,而不是直接轉換Drawable.
XML例子

下面的XML片段演示了如何在XMLlayout中添加一個資源Drawable到一個ImageView.

[html] <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:tint="#55ff0000"
android:src="@drawable/my_image"/>
<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:

[html] <transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/image_expand">
<item android:drawable="@drawable/image_collapse">
</transition>
<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的內容:
[java] Resources res = mContext.getResources();
TransitionDrawable transition = (TransitionDrawable)
res.getDrawable(R.drawable.expand_collapse);
ImageView image = (ImageView) findViewById(R.id.toggle_image);
image.setImageDrawable(transition);
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);

Android圖形系統中Drawable使用詳解
文章《Android圖形系統中Drawable使用詳解》二維碼
  • 微信打賞
  • 支付寶打賞

已有5條評論

  1. 嬰兒手推車

    博主你好,我的嬰兒手推車www.uusbbs.com想和博主換個鏈接可以不?

    2012-06-07 17:18 回復
  2. 游客 374

    第一次來支持你。

    2012-06-07 11:28 回復
  3. 窮小子

    好吧,下次希望看見你的昵稱,而不是游客

    2012-06-06 21:53 回復
  4. 游客 910

    分析的很好,歡迎回訪,下次還會來

    2012-06-06 15:20 回復

(必填)

(必填)

(可選)

黑龙江22选5开奖