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

來源:互聯網
上載者:User

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

 

本節引言:

在上一節中我們已經對瞭解了4個Android Drawable,他們分別是:

ColorDrawable,NinePatchDrawable,ShapeDrawable與GradientDrawable!

本節我們再來接著學習另外五個Drawable,分別是:

BitmapDrawable,InsertDrawable,ClipDrawable,RotateDrawable,AnimationDrawable!

好了,開始本節內容!

 

 

本節本文:

 

 

Android各種Drawable的大綱圖:

 


 

1.BitmapDrawable:

對Bitmap的一種封裝,可以設定它封裝的bitmap在BitmapDrawable地區中的繪製方式,有:

平鋪填充,展開填或保持圖片原始大小!以為根節點!

 

相關屬性:

src:圖片資源~

antialias:是否支援消除鋸齒

filter:是否支援位元影像過濾,支援的話可以是圖批判顯示時比較光滑

dither:是否對位元影像進行抖動處理

gravity:若位元影像比容器小,可以設定位元影像在容器中的相對位置

tileMode:指定圖片平鋪填充容器的模式,設定這個的話,gravity屬性會被忽略,有以下可選值:

disabled(整個圖案展開平鋪),(原圖大小),repeat(平鋪),mirror(鏡像平鋪)

分別的效果如下:

 

①XML定義BitmapDrawable:

 



②實現相同效果的Java代碼:

 

 

BitmapDrawable bitDrawable = new BitmapDrawable(bitmap);bitDrawable.setDither(true);bitDrawable.setTileModeXY(TileMode.MIRROR,TileMode.MIRROR);


 

 

 

2.InsetDrawable:

表示把一個Drawable嵌入到另外一個Drawable的誒不,並且在內部留一些間距,類似與

Drawable的padding屬性,但padding表示的是Drawable的內容與Drawable本身的邊距!

而InsetDrawable表示的是兩個Drawable與容器之間的邊距,當控制項需要的背景比實際的邊框

小的時候,比較適合使用InsetDrawable,比如使用這個可以解決我們自訂Dialog與螢幕之間

的一個間距問題,相信做過的朋友都知道,即使我們設定了layout_margin的話也是沒用的,這個

時候就可以用到這個InsetDrawable了!只需為InsetDrawable設定一個insetXxx設定不同

方向的邊距,然後為設定為Dialog的背景即可!

 

相關屬性:

1.drawable:引用的Drawable,如果為空白,必須有一個Drawable類型的子節點!

2.visible:設定Drawable是否額空間

3.insetLeft,insetRight,insetTop,insetBottm:設定左右上下的邊距

 

①XML中使用:

 



②Java代碼中使用:

 

 

InsetDrawable insetDrawable = new InsetDrawable(getResources().getDrawable(R.drawable.test1), 10, 10, 10, 10);

運行結果:

 

 

 

 

3.ClipDrawable:

Clip可以譯為剪的意思,我們可以把ClipDrawable理解為從位元影像上剪下一個部分;

Android中的進度條就是使用ClipDrawable來實現的,他根據設定level的值來決定剪下

地區的大小,根節點是

 

相關屬性:

clipOrietntion:設定剪下的方向,可以設定水平和豎直2個方向

gravity:從那個位置開始裁剪

drawable:引用的drawable資源,為空白的話需要有一個Drawable類型的子節點

ps:這個Drawable類型的子節點:就是在加上這樣的語句:

這樣...

 

使用樣本:

核心就是通過代碼修改ClipDrawable的level即可!

這裡我們實現一個類似於進度條的效果,另外這個Level的值是0~10000哦:

①定義一個ClipDrawable的資源xml:

 


②在activity_main主布局檔案中設定一個ImageView,將src設定為clipDrawable!

 

記住是src哦,如果你寫成了blackground的話可是會報null 指標的哦!!!!

 

    

③MainActivity.java通過setLevel設定截取地區大小;

 

 

package com.jay.example.drawabletest;import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.graphics.drawable.ClipDrawable;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.widget.ImageView;public class MainActivity extends Activity {private ImageView imgShow1;private ClipDrawable cd;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == 0x123) {cd.setLevel(cd.getLevel() + 500);}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imgShow1 = (ImageView) findViewById(R.id.imgShow1);// 核心實現代碼cd = (ClipDrawable) imgShow1.getDrawable();final Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {handler.sendEmptyMessage(0x123);if (cd.getLevel() >= 10000) {timer.cancel();}}}, 0, 300);}}

運行:

 


 

4.RotateDrawable:

用來對Drawable進行旋轉,也是通過setLevel來控制旋轉的,最大值也是:10000

相關的屬性:

fromDegrees:起始的角度,,對應最低的level值,預設為0

toDegrees:結束角度,對應最高的level值,預設360

pivotX:設定參照點的x座標,取值為0~1,預設是50%,即0.5

pivotY:設定參照點的Y座標,取值為0~1,預設是50%,即0.5

ps:如果出現旋轉圖片顯示不完全的話可以修改上述兩個值解決!

drawable:設定位元影像資源

visible:設定drawable是否可見!

 

另外角度圖如下:

 

 

使用樣本:

在第三點的clipDrawable上做一點點修改即可!

①定義一個rotateDrawable資源檔:

 



②activity_main.xml中修改下src指向上述drawable即可,MainActivity只需要把ClipDrawable

 

改成rotateDrawable即可!

 

package com.jay.example.drawabletest;import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.graphics.drawable.RotateDrawable;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.widget.ImageView;import android.widget.Toast;public class MainActivity extends Activity {private ImageView imgShow1;private RotateDrawable cd;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == 0x123) {if (cd.getLevel() >= 10000)Toast.makeText(MainActivity.this, 轉完了~,Toast.LENGTH_LONG).show();cd.setLevel(cd.getLevel() + 300);}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imgShow1 = (ImageView) findViewById(R.id.imgShow1);// 核心實現代碼cd = (RotateDrawable) imgShow1.getDrawable();final Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {handler.sendEmptyMessage(0x123);if (cd.getLevel() >= 10000) {timer.cancel();}}}, 0, 300);}}


 

運行:

 

 

 

 

5.AnimationDrawable:

今天最後一個Drawable了,這個是用來實現Android中幀動畫的,就是把一系列的Drawable,

按照一定得順序一幀幀地播放;Android中動畫比較豐富,有傳統補間動畫,平移,縮放等等效果,

但是這裡我們僅僅介紹這個AnimationDrawable實現幀動畫,關於alpha,scale,translate,rotate

等,後續在動畫章節再進行詳細的介紹~我們這裡使用作為根節點

 

相關屬性方法:

oneshot:設定是否迴圈播放,false為迴圈播放!!!

duration:幀間隔時間,通常我們會設定為300毫秒~

我們獲得AniamtionDrawable執行個體後,需要調用它的start()方法播放動畫,另外要注意

在OnCreate( )方法中調用的話,是沒有任何效果的,因為View還沒完成初始化,我們可以

用簡單的handler來延遲播放動畫!當然還有其他的方法,可見下述連結:

Android AnimationDrawable start()沒效果!

使用這個AnimationDrawable來實現幀動畫真的是非常方便的~

 

程式碼範例:

①先定義一個AnimationDrawable的xml資源檔:

 

                    

②activity_main.xml設定下src,然後MainActivity中:

 

 

package com.jay.example.drawabletest;import android.app.Activity;import android.graphics.drawable.AnimationDrawable;import android.os.Bundle;import android.os.Handler;import android.widget.ImageView;public class MainActivity extends Activity {private ImageView imgShow1;private AnimationDrawable ad;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imgShow1 = (ImageView) findViewById(R.id.imgShow1);// 核心實現代碼ad = (AnimationDrawable) imgShow1.getDrawable();Handler handler = new Handler();handler.postDelayed(new Runnable() {@Overridepublic void run() {ad.start();}}, 300);}}

運行:

 

 

還是比較有趣的,UC瀏覽器連不到網提示頁面後面有個會動的動畫,估計也是拿這個來實現的,

反編譯apk後找不到相應的動畫圖片,只能拿這個小花來代替了~

 

 

 

 

 

 

 

聯繫我們

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