android drawable 應用

來源:互聯網
上載者:User

Android SDK提供了一個強大的類Drawable,Drawable這個抽象類別到底代表了什麼,如何使用?Drawable是個很抽象的概念,通過簡單的例子程式來學習它,理解它。先看個簡單的例子,使用Drawable的子類ShapeDrawable來畫圖,如下:
public class testView extends View {
private ShapeDrawable mDrawable;
public testView(Context context) {
super(context);
int x = 10;
int y = 10;
int width = 300;
int height = 50;
mDrawable = new ShapeDrawable(new OvalShape());
mDrawable.getPaint().setColor(0xff74AC23);
mDrawable.setBounds(x, y, x + width, y + height);
}
protected void onDraw(Canvas canvas)
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);//畫白色背景
mDrawable.draw(canvas);
}
}
程式的運行結果,顯示如下:

簡要解析:
  1. 建立一個OvalShape(一個橢圓);
  2. 使用剛建立的OvalShape構造一個ShapeDrawable對象mDrawable
  3. 設定mDrawable的顏色;
  4. 設定mDrawable的大小;
  5. 將mDrawable畫在testView 的畫布上;

這個簡單的例子可以幫我們理解什麼是Drawable,Drawable就是一個可畫的對象,其可能是一張位元影像(BitmapDrawable),也可能是一個圖形(ShapeDrawable),還有可能是一個圖層(LayerDrawable),我們根據畫圖的需求,建立相應的可畫對象,就可以將這個可畫對象當作一塊“畫布(Canvas)”,在其上面操作可畫對象,並最終將這種可畫對象顯示在畫布上,有點類似於“記憶體畫布“。

上面只是一個簡單的使用Drawable的例子,完全沒有體現出Drawable的強大功能。Android SDK中說明了Drawable主要的作用是:在XML中定義各種動畫,然後把 XML當作Drawable資源來讀取,通過Drawable顯示動畫。下面舉個使用TransitionDrawable 的例子,建立一個Android工程,然後再這個工程的基礎上修改,修改過程如下:
1、去掉layout/main.xml中的TextView,增加ImagView,如下:
<ImageView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:tint=”#55ff0000″
android:src=”@drawable/my_image”/>

2、建立一個XML檔案,命名為expand_collapse.xml,內容如下:
<?xml version=”1.0″ encoding=”UTF-8″?>
<transition xmlns:android=”http://schemas.android.com/apk/res/android”>
<item android:drawable=”@drawable/image_expand”/>
<item android:drawable=”@drawable/image_collapse”/>
</transition>
需要3張png圖片,存放到res\drawable目錄下,3張圖片分別命名為:my_image.png、image_expand.png、image_collapse.png。

3、修改Activity中的代碼,內容如下:
LinearLayout mLinearLayout;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLinearLayout = new LinearLayout(this);
ImageView i = new ImageView(this);
i.setAdjustViewBounds(true);
i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
mLinearLayout.addView(i);
setContentView(mLinearLayout);
Resources res = getResources();
TransitionDrawable transition =
(TransitionDrawable) res.getDrawable(R.drawable.expand_collapse);
i.setImageDrawable(transition);
transition.startTransition(10000);
}

4、如果修改的沒有錯誤,運行程式,結果顯示如下:
初始圖片

過渡中的圖片

最後的圖片

螢幕上動畫顯示的是: 從圖片image_expand.png過渡到image_collapse.png,也就是我們在expand_collapse.xml中定義的一個transition動畫。看完這個例子,你對Drawable的理解是否又深入些?這裡提供這個程式的原始碼,供大家下載,可以在這個例子的基礎上去體會其他的Drawable,來加深對Drawable的理解。

1、圖片資源

圖片資源是最簡單的Drawable資源,只要把*.png、*.jpg*、.gif等格式的圖片放入/res/drawable-XXX目錄下,Android SDK就會在編譯應用自動載入該圖片,並在R資源清單類中產生該資源的引用。

Android不允許圖片資源的檔案名稱中出現大寫字母,且不能以數字開頭。

java中訪問資源:[<package>.]R.drawable.<file_name>

XML中訪問資源:@[<package_name:>]drawable/file_name

為了在程式中獲得實際的Drawable對象,Resources提供了Drawable getDrawable(int id)方法,該方法跟據Drawable資源在R清單類中的ID擷取實際的Drawable對象。

2、StateListDrawable資源

StateListDrawable用於組織多個Drawable對象。當使用StateListDrawable作為目標組件的背景、前景圖片時,StateListDrawable對象所顯示的Drawable對象會隨目標組件形態的改變而自動切換。

定義StateListDrawable對象的XML檔案的根項目為<selector../>,該元素可包含多個<item.../>元素,該元素可指定如下屬性:

android:color或android:drawable:指定顏色或drawable對象

android:state_xxx:指定一個特定狀態

3、LayerDrawable資源

與StateListDrawable有點類似,LayerDrawable也可以包含一個Drawable數組,因此系統將會按這些Drawable對象的數組順序來繪製它們,索引最大的Drawable對象將會被繪製在最上面。

定義LayerDrawable對象的XML檔案的根項目為<layer-list.../>,該元素可以包含多個<item.../>元素,該元素可指定如下屬性:

android:drawable:指定作為LayerDrawable元素之一的Drawable對象。

android:id:為該Drawable對象指定一個標識

android:buttom|top|button:它們用於指定一個長度值,用於指定將該Drawable對象繪製到目標組件的指定位置

4、ShapeDrawable資源

ShapeDrawable用於定義一個基本的幾何圖形(如矩形、圓形、線條等),定義ShapeDrawable的XML檔案的根項目是<shape.../>元素,該元素可指定如下屬性:

android:shape=["rectangle"|"Oval"|"line"|"ring"]:指定定義哪種類型的幾何圖形

5、ClipDrawable資源

ClipDrawable代表從其它位元影像上截取的一個“圖片片段”。在XML檔案中定義ClipDrawable對象使用<clip.../>元素。

可指定如下三個屬性:

android:drawable:指定截取的源Drawable對象

android:clipOrientation:指定截取方向,可設定水平截取或垂直截取

android:gravity:指定截取時的對齊

使用ClipDrawable對象可調用setLevel(int level)方法來設定截取的地區大小。當Level為0時,截取的圖片片段為空白,當Level為10000時,截取整張圖片。

6、AnimationDrawable資源

AnimationDrawable代表一個動畫。定義補間動畫的XML資源檔以<set.../>元素作為根項目,該元素內可以指定如下4個元素:

alpha:設定透明度的改變

scale:設定圖片進行縮放改變

translate:設定圖片進行位移變換

rotate:設定圖片進行旋轉

定義動畫的XML資源應該放在/res/anim路徑下,當使用ADT建立一個Android應用時,預設不會包含該路徑,開發人員需要自行建立該路徑。

定義補間動畫的思路很簡單:設定一張圖片的開始狀態(包括透明度、位置、縮放比、旋轉度)、並設定圖片的結束狀態(包括透明度、位置、縮放比、旋轉度),再設定動畫的期間,Android系統會使用動畫效果把這張圖片從開始狀態變換到結束狀態。

在java代碼中訪問動畫資源檔案:[<package>.]R.anim.<file_name>

在XML檔案中訪問動畫資源檔案:@[<package_name>:]anim/file_name

為了在java代碼中擷取實際的Animation對象,可以調用AnimationUtils的如下方法:loadAnimation(Context ctx,int resld)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.