Drawable資源是安卓應用中最多見的一種資源,好比圖片等,所以,對於初學者而言,必須掌握drawable資源相關應用。html
今天在網上恰好看到了一篇介紹android Drawable資源的文章,分享給你們,但願對你們開發android應用時,使用Drawable資源有所幫助吧。廢話很少說,趕忙學起來吧。java
Drawable是什麼?android
Drawable是一個抽象類(abstract class),它有好多子類(SubClass)來操做具體類型的資源,好比BitmapDrawable是用來操做位圖,ColorDrawable用來操做顏色,ClipDrawable用來操做剪切板等。編程
在android開發中,Drawable資源通常存儲在應用程序目錄的\res\drawable目錄下,固然依據分辨率的高低能夠分別存儲不一樣分辨率的資源到以下幾個目錄:canvas
\res\drawable-ldpiide
\res\drawable-mdpi函數
\res\drawable-hdpi工具
\res\drawable-xhdpioop
圖片資源佈局
在android中,圖片資源是簡單的Drawable資源,目前Android支持的圖片格式有:gif、png、jpg等。咱們只須要把圖片資源放置到\res\drawable目中,那麼在編譯後的R.java類中就會生成圖片資源的資源ID。
咱們在android編程中就能夠經過調用相關的方法來獲取圖片資源(程序中若是要訪問drawable_resource_file_name,那麼能夠如此:[packagename].R.drawable.drawable_resource_file_name)。
但這裏須要注意的是,Android drawable資源的名稱有約束,必須是: [a-z0-9_.](即:只能是字母數字及_和.),並且不能以數字開頭,不然編譯會報錯 : Invalid file name: must contain only [a-z0-9_.]
下面經過一個代碼,直觀的演示如何訪問一個圖片資源(資源名稱drawablefilename):
ImageView imageView=(ImageView)
findViewById(R.id.ImageView1);
imageView.setImageResource(
R.drawable.drawablefilename);
StateListDrawable資源
StateListDrawable內能夠分配一組Drawable資源,StateListDrawable 被定義在一個XML文件中,以 <selector> 元素起始。其內部的每個Drawable資源內嵌在 <item>元素中。
當StatListDrawable資源做爲組件的背景或者前景Drawable資源時,能夠隨着組件狀態的變動而自動切換相對應的資源 ,例如,一個Button能夠處於不一樣的狀態(按鈕按下、獲取焦點)。
咱們可使用一個StateListDrawable資源,來提供不一樣的背景圖片對於每個狀態。當組件的狀態變動時,會自定向下遍歷StateListDrawable對應的xml文件來查找第一個匹配的Item。
下面咱們經過一段代碼片斷,來向你們展現StateListDrawable資源的XML文件描述:
XML 文件存儲在: res/drawable/button_statelist.xml :
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android=" http://www.maiziedu.com/course/android/">
<item android:state_pressed="true"
android:drawable="@drawable/button_pressed" />
<item android:state_focused="true"
android:drawable="@drawable/button_focused" />
<item android:state_hovered="true"
android:drawable="@drawable/button_focused" />
<item android:drawable="@drawable/button_normal"/>
</selector>
如下是Button的Layout文件:
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/button"
/>
固然咱們也能夠經過代碼來設置Button的背景圖片:
Button imageButton=(Button)
findViewById(R.id.imageButton);
imageButton.setBackgroundResource
(R.drawable.button_statelist);
ShapeDrawable資源
ShapeDrawable資源能夠用於繪製一個特定的形狀 ,好比矩形、橢圓等。若是你想本身動態的繪製二位圖形,那麼咱們就可使用ShapeDrawable資源對象,用ShapeDrawable,繪製咱們所能想象的形狀。
一個ShapeDrawable 須要一個Shape對象來管理呈現資源到UI Screen,若是沒有Shape設置,那麼會默認使用RectShape對象。
ShapeDrawable 被定義在一個XML文件中,以 <shape> 元素起始。其內部的每個Drawable資源內嵌在 <item>元素中。
經過下面的代碼片斷,咱們能夠看看ShapeDrawable的XML定義:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android=" http://www.maiziedu.com/course/android/"
android:shape="oval">
<!-- 定義填充漸變顏色 -->
<gradient
android:startColor="#00f"
android:endColor="#00f"
android:angle="45"
android:type="sweep"/>
<!-- 設置內填充 -->
<padding android:left="7dp"
android:top="7dp"
android:right="7dp"
android:bottom="7dp" />
<!-- 設置圓角矩形 -->
<corners android:radius="8dp" />
</shape>
咱們能夠用ShapeDrawable 來設置組件的背景色( setBackgroundDrawable()方法 ),如上的代碼片斷可設置一個TextEdit的背景色爲藍色的橢圓形狀。固然咱們也能夠繪製自定義的View。
咱們構建自定義形狀的View時,因爲ShapeDrawable 有其本身的draw()方法,能夠構建一個View視圖的子類,而後override View.onDraw()方法,以下代碼片斷是一個樣例:
public class CustomDrawableView extends View {
private ShapeDrawable mDrawable;
public CustomDrawableView(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) {
mDrawable.draw(canvas);
}
}
基於上述代碼咱們能夠在咱們的Activity中編程的構建自定義視圖:
CustomDrawableView mCustomDrawableView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCustomDrawableView =
new CustomDrawableView(this);
setContentView(mCustomDrawableView);
}
固然咱們也可使用XML文件來描述:自定義的Drawable類必須重載view (Context, AttributeSet) 構造函數。接着咱們添加Layout文件以下:
<com.example.shapedrawable.CustomDrawableViewandroid:layout_width="fill_parent"
android:layout_height="wrap_content"/>
ClipDrawable
ClipDrawable資源定義在一個XML中,表示裁剪(Clips)一個其餘資源基於ClipDrawable資源的Level。你能夠控制裁剪的Drawable的寬度高度及gravity屬性,ClipDrawable經常被用來做爲一個progressbars的實現。
如下樣例是一個ClipDrawable資源:
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android=" http://www.maiziedu.com/course/android/"
android:drawable="@drawable/android"
android:clipOrientation="horizontal"
android:gravity="left"/>
下面的ImageView佈局文件應用Clipdrawable資源:
<ImageViewandroid:id="@+id/image"
android:background="@drawable/clip"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
下面的代碼獲取drawable而且增長其裁剪,以便於漸增的顯示圖像
ImageView imageview = (ImageView)
findViewById(R.id.image);
ClipDrawable drawable = (ClipDrawable)
imageview.getDrawable();
drawable.setLevel(drawable.getLevel() + 1000);
固然咱們可使用一個Timer來實現圖片的漸增顯示。
可是這裏須要注意的一點是,默認的Level值是0,表示圖片被這個裁剪,故圖片是不可見的。當值達到10000是代碼裁剪爲0,圖片能夠徹底顯示。
AnimationDrawable
AnimationDrawable經過定義一系列的Drawable對象構建一個基於幀的動畫(frame-by-frame animations),能夠被用來做爲視圖的背景色。
最簡單的構建一個幀動畫是在XML文件中構建一個動畫,咱們能夠設定動畫做爲視圖的背景色,經過調用AnimationDrawable.start()方法來運行動畫。
以下代碼片斷是一個AnimationDrawable資源的XML文件,資源文件位置:res\drawable\spin_animation.xml
<animation-list
xmlns:android=" http://www.maiziedu.com/course/android/"android:oneshot="true">
<item
android:drawable="@drawable/rocket_thrust1"
android:duration="200" />
<item
android:drawable="@drawable/rocket_thrust2"
android:duration="200" />
<item
android:drawable="@drawable/rocket_thrust3"
android:duration="200" />
</animation-list>
咱們能夠看到,AnimationDrawable資源文件以 <animation-list>元素爲根,包含一系列的<Item>節點,每個節點定義了一個幀(frame)及持續時常。
上述動畫運行了3個幀,經過設置<code>android:oneshot</code> 屬性(attribute)爲true,動畫會循環一次並停留在最後一幀,若是爲false那麼會輪詢(loop)的運行動畫。
咱們能夠經過編碼來加載播放動畫:
ImageView img = (ImageView)
findViewById(R.id.spinning_wheel_image);
img.setBackgroundResource(
R.drawable.spin_animation);
AnimationDrawable frameAnimation =
(AnimationDrawable) img.getBackground();
frameAnimation.start();
可是須要提醒你們的是,AnimationDrawable. start()方法不可以在Activity的onCreate()方法中調用,由於AnimationDrawable還未徹底的附加 (attached)到Window,若是你不須要交互而當即播放動畫,那麼能夠在onWindowFocusChanged() 方法中,這個方法會在你的Activity Windows獲取焦點是觸發。
上面就是android應用中Drawable資源的相關介紹,因爲篇幅問題,只介紹了幾個比較常見的Drawable資源,還有一些Drawable子類爲進行介紹,你們能夠直接查看相關官方文檔學習。
我的感受上面的介紹仍是頗有用的,是android開發中比較經常使用到的一些操做,你們能夠收藏,在之後須要用的時候,直接查閱。
相關文章:《Android開發工具經常使用快捷鍵大全》