Android UI集錦——1.Android Drawable分類匯總(3/3),1.androiddrawable

來源:互聯網
上載者:User

Android UI集錦——1.Android Drawable分類匯總(3/3),1.androiddrawable

Android UI集錦——1.Android Drawable分類匯總(3/3)

               ~轉載請註明出處coder-pig


本節引言:

前面兩節我們已經瞭解了Android中的2/3的Drawable,在本節中我們就把剩下的

1/3給學習了吧~他們分別是:

LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable,

好了,開始本節內容~



本節本文:

Android各種Drawable的大綱圖:



1.LayerDrawable:

其實就是層繪圖物件,包含一個Drawable數組,然後按照數組對應的順序來繪製他們,索引

值最大的Drawable會被繪製在最上層!雖然這些Drawable會有交叉或者重疊的地區,但

他們位於不同的層,所以並不會相互影響,以<layer-list../>作為根節點!


相關屬性:

drawable:引用的位元影像資源,如果為空白徐璈有一個Drawable類型的子節點

left:層相對於容器的左邊距

right:層相對於容器的右邊距

top:層相對於容器的上邊距

bottom:層相對於容器的下邊距

id:層的id


程式碼範例:

自訂拖動條外觀(seekbar)與層疊的圖片:

先看下吧:



,一個自訂的進度條和三張層疊的圖片!

代碼也是很簡單的,關於seekbar的屬性就不講解了~

seekbar用到的layerlist_one.xml:

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android" >    <item        android:id="@android:id/background"        android:drawable="@drawable/seek_bkg"/>    <item        android:id="@android:id/progress"        android:drawable="@drawable/bar"/></layer-list>

層疊圖片的layerlist_two.xml:

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android" >    <item>        <bitmap android:src="@drawable/pig" android:gravity="center"/>    </item>    <item android:top="25dp" android:left="25dp">        <bitmap android:src="@drawable/pig" android:gravity="center"/>    </item>    <item android:top="50dp" android:left="50dp">        <bitmap android:src="@drawable/pig" android:gravity="center"/>    </item></layer-list>

引用他們的main_activity.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center"    android:orientation="vertical"    tools:context="com.jay.example.drawabletest.MainActivity" >    <SeekBar        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal"        android:indeterminateOnly="false"        android:maxHeight="8dp"        android:minHeight="8dp"        android:progressDrawable="@drawable/layerlist_one"        android:thumb="@drawable/woniu"        android:thumbOffset="10dp" />    <ImageView         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/layerlist_two"/>    </LinearLayout>


好了,LayerDrawable就這麼簡單~






2.TransitionDrawable:

這個Drawable是前者LayerDrawable的一個子類,但是他值管理2層!!!Drawable,並且提供了

透明度變化的動畫,可以控制一層Drawable過度到另一層Drawable的動畫效果,根節點

<transition../>,記住只能有2個item哦!多了也沒用=-=,屬性和前者差不多,

我們需要調用startTransition方法才能啟動兩層間的切換動畫;我們也可以反過來播放

動畫:reverseTransition方法!


一個簡單的例子:



代碼很簡單,建立一個TransitionDrawable的xml檔案:

<?xml version="1.0" encoding="utf-8"?><transition xmlns:android="http://schemas.android.com/apk/res/android" ><item android:drawable="@drawable/meinv1"/><item android:drawable="@drawable/meinv2"/></transition>

接著main_activity弄個ImageView設定下src指向上述drawable,接著MainActivity中:

package com.jay.example.drawabletest;import android.app.Activity;import android.graphics.drawable.AnimationDrawable;import android.graphics.drawable.TransitionDrawable;import android.os.Bundle;import android.os.Handler;import android.widget.ImageView;public class MainActivity extends Activity {private ImageView imgShow;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imgShow = (ImageView) findViewById(R.id.imgShow);TransitionDrawable td = (TransitionDrawable) imgShow.getDrawable();td.startTransition(3000);//你可以可以反過來播放,使用reverseTransition即可~//td.reverseTransition(3000);}}

好了,就這麼簡單,就一次,讀者也覺得沒意思吧,美女沒看夠對吧~

好吧,這裡找到別人寫的一個代碼,這裡給大家貼下,有興趣的可以研究下,不算複雜~

原文連結:http://blog.csdn.net/lonelyroamer/article/details/8243606

詳細代碼如下:(核心就是hanler定時,修改Transition中兩個圖片~)

package com.jay.example.drawabletest;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.graphics.drawable.TransitionDrawable;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.widget.ImageView;public class MainActivity extends Activity {private int change = 0;private ImageView imgShow;private Drawable[] drawables;private int[] ids = new int[] { R.drawable.meinv1, R.drawable.meinv2,R.drawable.meinv3, R.drawable.meinv4, R.drawable.meinv5 };// 處理transition的改變private Handler handler = new Handler(new Handler.Callback() {public boolean handleMessage(Message msg) {int duration = msg.arg1;TransitionDrawable transitionDrawable = null;transitionDrawable = new TransitionDrawable(new Drawable[] {drawables[change % ids.length],drawables[(change + 1) % ids.length] });change++;imgShow.setImageDrawable(transitionDrawable);transitionDrawable.startTransition(duration);return false;}});@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imgShow = (ImageView) findViewById(R.id.imgShow);// 根據資源id,把圖片都載入成Drawable~BitmapFactory.Options opts = new BitmapFactory.Options();opts.inJustDecodeBounds = true;BitmapFactory.decodeResource(getResources(), R.drawable.meinv1, opts);opts.inSampleSize = computeSampleSize(opts, -1, 720 * 1280);opts.inJustDecodeBounds = false;drawables = new Drawable[ids.length];try {for (int i = 0; i < ids.length; i++) {// for迴圈,載入5個drawable資源Bitmap bmp = BitmapFactory.decodeResource(getResources(),ids[i], opts);drawables[i] = new BitmapDrawable(bmp);}} catch (Exception e) {e.printStackTrace();}// 開啟線程,改變transitionnew Thread(new MyRunnable()).start();}// 線程,去發送訊息,讓transition一直改變private class MyRunnable implements Runnable {public void run() {while (true) {int duration = 3000;// 改變的間隔Message message = handler.obtainMessage();message.arg1 = duration;handler.sendMessage(message);try {Thread.sleep(duration);} catch (InterruptedException e) {e.printStackTrace();}}}}// 計算合適的圖片大小public static int computeSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) {int initialSize = computeInitialSampleSize(options, minSideLength,maxNumOfPixels);int roundedSize;if (initialSize <= 8) {roundedSize = 1;while (roundedSize < initialSize) {roundedSize <<= 1;}} else {roundedSize = (initialSize + 7) / 8 * 8;}return roundedSize;}// 計算合適的圖片大小private static int computeInitialSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) {double w = options.outWidth;double h = options.outHeight;int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength));if (upperBound < lowerBound) {// return the larger one when there is no overlapping zone.return lowerBound;}if ((maxNumOfPixels == -1) && (minSideLength == -1)) {return 1;} else if (minSideLength == -1) {return lowerBound;} else {return upperBound;}}}

運行:





3.LevelListDrawable:

這個是用來管理一組Drawable的,我們可以為裡面的drawable設定不同的level,

當他們繪製的時候,會根據level屬性值擷取對應的drawable繪製到畫布上,根節點

為:<level-list.../>他並沒有屬性節點哦,就是說我們能做的只是設定每個<item>


item可設定的相關屬性:

drawable:引用的位元影像資源,如果為空白徐璈有一個Drawable類型的子節點

minlevel:level對應的最小值

maxlevel:level對應的最大值


程式碼範例:

我們動態地修改level值,實現下述效果:



代碼實現:

首先,我們編寫一個LevelListDrawable的xml資源檔:

<?xml version="1.0" encoding="utf-8"?><level-list xmlns:android="http://schemas.android.com/apk/res/android" >    <item android:drawable="@drawable/cir1" android:maxLevel="2000"/>    <item android:drawable="@drawable/cir2" android:maxLevel="4000"/>    <item android:drawable="@drawable/cir3" android:maxLevel="6000"/>    <item android:drawable="@drawable/cir4" android:maxLevel="8000"/>    <item android:drawable="@drawable/cir5" android:maxLevel="10000"/></level-list>


接下來就到MainActivity,一個Timer定時器,handler修改level值即可~

package com.jay.example.drawabletest;import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.graphics.drawable.LevelListDrawable;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.widget.ImageView;public class MainActivity extends Activity {private ImageView imgShow;private LevelListDrawable ld;private Handler handler = new Handler(){public void handleMessage(Message msg) {if(msg.what == 0x123){if(ld.getLevel() > 10000)ld.setLevel(0);else imgShow.setImageLevel(ld.getLevel()+2000);}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imgShow = (ImageView) findViewById(R.id.imgShow);ld = (LevelListDrawable) imgShow.getDrawable();imgShow.setImageLevel(0);new Timer().schedule(new TimerTask() {@Overridepublic void run() {handler.sendEmptyMessage(0x123);}}, 0,1000);}}



4.StateListDrawable:

終於來到最後一個Drawable了,看上去不熟悉吧,其實他就是我們平時為按鈕設定動態點擊背景的

selector,哈哈,再熟不過了吧~比如按鈕有按下,選中,點擊,不可用等等狀態,另外今天群裡有個朋友

問題布局弄這個selecotr可以,當然可以啦,不過要先為布局設定一個Clickable = "true"即可!

我們可以設定的屬性如下:


可設定的屬性:

drawable:引用的Drawable位元影像,我們可以把他放到最前面,就表示組件的正常狀態~

state_focused:是否獲得焦點

state_window_focused:是否獲得視窗焦點

state_enabled:控制項是否可用

state_checkable:控制項可否被勾選,eg:checkbox

state_checked:控制項是否被勾選

state_selected:控制項是否被選擇,針對有滾輪的情況

state_pressed:控制項是否被按下

state_active:控制項是否處於活動狀態,eg:slidingTab

state_single:控制項包含多個子控制項時,確定是否只顯示一個子控制項

state_first:控制項包含多個子控制項時,確定第一個子控制項是否處於顯示狀態

state_middle:控制項包含多個子控制項時,確定中間一個子控制項是否處於顯示狀態

state_last:控制項包含多個子控制項時,確定最後一個子控制項是否處於顯示狀態



代碼示範:

就弄個最簡單的selector,按鈕按下與非按下的,這個是筆者一個工程裡直接扣出來的:

內容可以直接無視,主要是看登入按鈕的點擊效果哈~

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" >    <item android:state_pressed="false" android:drawable="@drawable/ic_btn_select_add_course_normal"/><item android:state_pressed="true" android:drawable="@drawable/ic_btn_select_add_course_pressed"/></selector>

接著background設定下,你懂的,如下:





最後說兩句:

好的,一連三篇介紹Android中的Drawable,不知不覺已經到了尾聲了,讀者們有沒有get到新姿勢呢?

下一Part我們就來學一些圖形處理的基礎,Bitmap,paint,canvas,path等等,敬請期待~

如果你覺得本文不錯的話,給個贊讓更多的朋友看到如何?








聯繫我們

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