Drawable資源的初步使用

來源:互聯網
上載者:User

Drawable資源的初步使用

剛開始接觸到Android的時候,看到類似下面的一個Button:

當時感覺這樣的button有點像Material Design風格,真的以為是裁剪好的圖片,好奇心驅使我上網尋找實現的方法,原來不是裁剪好的圖片,只是用xml來定義我們想要的圖片,現在想想真的是挺搞笑,哈哈。實現這種圖片我們可以自訂view,當然啦,最簡單的還是用xml檔案來定義!

現在看來,實現上面的效果,真的是太簡單啦:

觀察上面的圖片,是一個近似長方形,但是四個角又有點有點圓滑。既然是Drawable資源,當然是在/res/drawable/下定義的啦,給出.xml檔案:

shaper.xml:

 

            
selector.xml:

 

 

                
然後Button控制項下使用android:background="@drawable/seletor_button",布局檔案很簡單,這裡就不寫出來了。
由selector.xml知,當鬆開按鈕時,按鈕的背景色也是藍色,我們當然可以換成其他的顏色,那就要重新定義一個shaper2.xml:

 

 

            
然後在selector.xml中:
 
效果:

 

 

 也許你會問,上面的xml檔案到底表示的是什麼呢,下面簡單的說明Drawable資源。

 

一.圖片資源

這個大家肯定不陌生,獲得/res/drawable/下的圖片(如:png,gif,jpg),可以直接R.drawable.picture或者:

 

                Resources resources = getResources();Drawable drawable = resources.getDrawable(R.drawable.picture);
注意在命名這些圖片時,不能以數字開頭,否則會報錯。圖片資源使用比較簡單,不詳細闡述。

 

二.StateListDrawable資源

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

類的繼承層次關係:

java.lang.Object   ? android.graphics.drawable.Drawable     ? android.graphics.drawable.DrawableContainer       ? android.graphics.drawable.StateListDrawable
如何使用該類資源呢?官方文檔上已經給出:

 

It can be defined in an XML file with the element. Each state Drawable is defined in a nested element. For more information, see the guide to Drawable Resources.

文檔指出定義StateListDrawable對象的xml檔案的根項目為,該元素可以包含多個元素。

既然用XML檔案定義,那麼有哪些屬性呢?(具體查閱API,這裡就不進行大量Ctrl C/V操作了)

簡單解釋下上面的屬性:

android:constantSize:
值為“true”表示隨著狀態變化,Drawable的大小保持不變(所有狀態中最大的size);值為“false”表示大小會變化。預設是false。
android:color或者android:drawable:指定顏色或者Drawable對象
支援的state_xxx狀態如下面幾種:
android:state_active:代表是否處於啟用狀態
android:state_checkable:代表是否處於可勾選狀態
android:state_checked:代表是否處於已勾選狀態
android:state_enabled:代表是否處於可用狀態
android:state_first:代表是否處於開始狀態
android:state_focused:代表是否處於已得到焦點狀態
android:state_last:代表是否處於結束狀態
android:state_middle:代表是否處於中間狀態
android:state_pressed:代表是否處於已被按下的狀態
android:state_selected:代表上是否處於被選中的狀態
android:state_window_focused:代表視窗是否處於已得到焦點狀態

具體使用方法還得在工作實踐中總結,文章開篇已經簡單的使用StateListDrawable資源檔,這裡就不再舉例。

三.ShapeDrawable資源

ShapeDrawable資源
ShapeDrawable用於定義一個基本的圖形(如矩形,線條,圓形,橢圓等等),定義的XML檔案的根項目是元素,該元素可以指定如下屬性:

 

shape=["rectangle"|"oval"|"line"|"ring"]  指定圖形形狀corners   定義幾何圖形的四個角的弧度gradient  定義使用漸層色填充padding   定義幾何形狀的內邊距(可以分別指定top,bottom,right,left)size      定義幾何形狀的大小solid     定義使用單種顏色填充stroke    定義為幾何形狀繪製邊框height    定義圖片高度width     定義圖片的寬度
使用方法相對簡單,不再舉例說明。
四.ClipDrawable資源

ClipDrawable資源定義在一個XML中,表示從其他資源裁剪一個"圖片片段"。在XML定義時使用作為根項目。

xml中的屬性:

 

drawable:指定截取Drawable對象clipOrientation:指定截取方向,可以設定垂直截取或者水平截取gravity:指定截取時的對齊
其中gravity的取值有很多,具體可以參考API這裡就不貼上來了。

 

通過demo簡單的說明下如何利用ClipDrawable資源檔緩緩的展開一張圖片的,clip.xml:

 


 

上面也不需要解釋上面了吧,布局檔案也很簡單,就是一個ImageView:

 

   ...   ...     ...    ...
MainActivity.java:

 

 

public class MainActivity extends Activity {@SuppressWarnings("unused")private ClipDrawable clip;    Handler handler = new Handler(){    public void handleMessage(Message msg){       switch (msg.what) {case 0:clip.setLevel(clip.getLevel()+200);break;default:break;  }    }    };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);    ImageView psg = (ImageView)findViewById(R.id.psb);    clip = (ClipDrawable)psg.getDrawable();    final Timer time = new Timer();    time.schedule(new TimerTask() {@Overridepublic void run() {// TODO 自動產生的方法存根Message msg = new Message();msg.what = 0;handler.sendMessage(msg);if(clip.getLevel()>10000){time.cancel();}}},0,500);   }}
看下效果,已經等的不耐煩了:

 

 

上面代碼也很簡單,利用Timer定時器,每隔500毫秒時間利用Handler發送資訊,修改clip的Level,下面說明下Level:

裁剪一個其他資源基於ClipDrawable資源的Level, 預設的Level值是0,表示圖片被完全裁剪,因此圖片是不可見的。當值達到10000時,圖片不被裁剪,所以可以完全顯示。

五.RippleDrawable資源

5.0後出現的ripple,使得我們更加方便的定義出波紋效果的控制項,下面趕快來定義吧!(*^__^*) 嘻嘻……

首先還是看下基礎的知識點,當然了,官方API文檔是最好的資料:既然是用XML檔案定義的,那麼有什麼屬性呢?android:color 受到ripple影響時的顏色android:radius ripple完全傳播時的半徑不會就這兩個屬性吧!哈哈,仔細閱讀文檔知道,它的屬性繼承自LayerDrawable,LayerDrawable還沒學習呢,也沒關係,開啟看看有哪些屬性吧!哦呦,屬性真多啊,不過都是我們常見的(只截取部分屬性,更多參考文檔)下面來寫demo吧!在XML中自訂出一個帶波紋的button,當然離不了shaper,下面繼續,

 

shaper.xml:

 

        
rippler.xml:

 

 

                                                      
還有布局檔案:

 

 

效果:

上面還指定了5.0引入的新屬性android:elevation,使得組件“浮”起來的高度,通過該屬性可以讓該組件呈現3D效果,也就是Material Design風格,哈哈。當然也可以設定android:translationZ(設定該組件在Z方向上的位移,這個屬性多用在動畫資源中) 來達到該種效果。還可以通過方法setElevation(float) , setTranslationZ(float)來設定。

上面只是簡單的介紹幾種Drawable資源,還有LayerDrawable,AnimationDrawable,LevelListDrawable等沒有介紹。寫文章的主要目的為了自己複習鞏固知識,如果有幸協助到他人,本人非常開心!當然如果出現錯誤而影響到他人,這是自己不能容忍的錯誤!文章中若出現錯誤之處,懇請指正!不甚感激!

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.