Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android UI集錦——1.Android Drawable分類匯總(2/3)

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

編輯:關於Android編程

 

本節引言:

在上一節中我們已經對了解了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的話可是會報空指針的哦!!!!

 



    


③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() {
		@Override
		public void handleMessage(Message msg) {
			if (msg.what == 0x123) {
				cd.setLevel(cd.getLevel() + 500);
			}
		}
	};

	@Override
	protected 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() {
			@Override
			public 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() {
		@Override
		public 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);
			}
		}
	};

	@Override
	protected 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() {
			@Override
			public 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;

	@Override
	protected 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() {
			@Override
			public void run() {
				ad.start();
			}
		}, 300);
	}
}

運行截圖:

 

\

 

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

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

\

 

 

 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved