Android之開源框架NineOldAndroids動畫庫

1.介紹php


Android3.0推出了全新的AnimationAPI,使用起來很方便,可是不能在3.0如下版本使用,NineOldAndroids是一個能夠在任意Android版本上使用的AnimationAPI,API和Android3.0中的相似。
html

2.經常使用類

  • ObjectAnimator
  • ValueAnimator
  • AnimatorSet
  • ViewPropertyAnimator

類名與官方的API是對應的,只是包名爲com.nineoldandroids.animationjava


3.使用方法

首先導入NineOldAndroids的jar包。在Android3.0中,View中有一個animate方法,NineOldAndroids中提供了ViewPropertyAnimator.animate(View)與其對應,能夠選擇靜態導入。android

// 官方API(3.0以上)
mView.animate().setDuration(5000).rotationY(720).x(100).y(100).start();
		
// NineOldAndroids
ViewPropertyAnimator.animate(mView).setDuration(5000)
				.rotationY(720).x(100).y(100).start();
				
// 可使用靜態導入
import static com.nineoldandroids.view.ViewPropertyAnimator.animate;
// 直接調用animate方法
animate(mView).setDuration(5000).rotationY(720).x(100).y(100).start();

使用鏈式編程設置各類屬性參數,最終調用start()來啓動動畫,還能夠調用setStartDelay()設置動畫延遲啓動。git

能夠設置動畫的監聽器,在動畫開始、結束等時候加一些處理。github

ViewPropertyAnimator
	.animate(mIView)
	.setDuration(5000)
	.rotationY(720)
	.x(100).y(100)
	.setListener(new AnimatorListenerAdapter() {
		@Override
		public void onAnimationStart(Animator animation) {
			super.onAnimationStart(animation);
			// 動畫開始
		}
		@Override
		public void onAnimationCancel(Animator animation) {
			super.onAnimationCancel(animation);
			// 動畫取消
		}
		@Override
		public void onAnimationEnd(Animator animation) {
			super.onAnimationEnd(animation);
			// 動畫結束
		}
		@Override
		public void onAnimationRepeat(Animator animation) {
			super.onAnimationRepeat(animation);
			// 動畫重複啓動
		}
	}).start();

ViewPropertyAnimator對象提供了取消動畫的方法編程

ViewPropertyAnimator animate = ViewPropertyAnimator.animate(mDropTv);
/* ... */
animate.start();	// 開始動畫
animate.cancel();	// 取消動畫

簡單的動畫效果使用ViewPropertyAnimator通常能夠知足,下面介紹一下高級玩法。核心是ObjectAnimator類。數組

4.舉例

背景顏色從紅色到藍色,並反轉回去,並且無限重複。
ValueAnimator colorAnim = ObjectAnimator.ofInt(mView, "backgroundColor", /*紅色*/0xFFFF8080, /*藍色*/0xFF8080FF);
colorAnim.setDuration(3000);
colorAnim.setEvaluator(new ArgbEvaluator());	// ARGB
colorAnim.setRepeatCount(ValueAnimator.INFINITE);   // 無限重複
colorAnim.setRepeatMode(ValueAnimator.REVERSE); // 反轉回去
colorAnim.start(景顏色從紅色到藍色,並且無限重複。
AnimatorSet set = new AnimatorSet();
set.playTogether(
    ObjectAnimator.ofFloat(myView, "rotationX", 0, 360),
    ObjectAnimator.ofFloat(myView, "rotationY", 0, 180),
    ObjectAnimator.ofFloat(myView, "rotation", 0, -90),
    ObjectAnimator.ofFloat(myView, "translationX", 0, 90),
    ObjectAnimator.ofFloat(myView, "translationY", 0, 90),
    ObjectAnimator.ofFloat(myView, "scaleX", 1, 1.5f),
    ObjectAnimator.ofFloat(myView, "scaleY", 1, 0.5f),
    ObjectAnimator.ofFloat(myView, "alpha", 1, 0.25f, 1)
);
set.setDuration(5 * 1000).start();

使用動畫集合AnimatorSet,可使用多個ObjectAnimator,實現複雜的動畫效果。
ide

AnimatorSet主要方法有兩個,playSequentially 是建立按順序執行的動畫,playTogether是建立同時執行的動畫。動畫

5.ObjectAnimator說明

ObjectAnimator是動畫對象,經過ObjectAnimator提供的一系列of開頭的靜態方法建立。

建立通常須要傳入三個參數

  • target,Object類型,可不是View哦
  • PropertyName,String類型或Property類型,用於描述target中的屬性
  • 數組,ofInt()就是int數組

ObjectAnimator原理是這樣的:會調用targetset方法,設置PropertyName的值,這個值的計算方式是,根據Duration時長和第三個參數數組來計算出來當前時間的值。而後調用set方法設置進去。例如上面更改背景顏色的實例PropertyNamebackgroundColor,數組是兩個顏色值,運行動畫就會根據Duration計算當前的顏色值,調用targetsetBackgroundColor方法設置進去,從而改變了背景顏色。

再看改AnimatorSet的實例PropertyNamerotationXtranslationX之類的,這幾個屬性是在Android3.0以上纔有的,因此調用set方法會出錯的,經過觀察ObjectAnimator,發現對這幾個屬性作了特殊處理,提早預製了這幾個屬性值。

static {
        PROXY_PROPERTIES.put("alpha", PreHoneycombCompat.ALPHA);
        PROXY_PROPERTIES.put("pivotX", PreHoneycombCompat.PIVOT_X);
        PROXY_PROPERTIES.put("pivotY", PreHoneycombCompat.PIVOT_Y);
        PROXY_PROPERTIES.put("translationX", PreHoneycombCompat.TRANSLATION_X);
        PROXY_PROPERTIES.put("translationY", PreHoneycombCompat.TRANSLATION_Y);
        PROXY_PROPERTIES.put("rotation", PreHoneycombCompat.ROTATION);
        PROXY_PROPERTIES.put("rotationX", PreHoneycombCompat.ROTATION_X);
        PROXY_PROPERTIES.put("rotationY", PreHoneycombCompat.ROTATION_Y);
        PROXY_PROPERTIES.put("scaleX", PreHoneycombCompat.SCALE_X);
        PROXY_PROPERTIES.put("scaleY", PreHoneycombCompat.SCALE_Y);
        PROXY_PROPERTIES.put("scrollX", PreHoneycombCompat.SCROLL_X);
        PROXY_PROPERTIES.put("scrollY", PreHoneycombCompat.SCROLL_Y);
        PROXY_PROPERTIES.put("x", PreHoneycombCompat.X);
        PROXY_PROPERTIES.put("y", PreHoneycombCompat.Y);
    }

6.總結

NineOldAndroids的API與官方的API基本一致,使用很方便。可以輕鬆實現各類酷炫動畫效果。

  • 通常狀況使用ViewPropertyAnimator就能夠了,能夠設置動畫監聽器,實現連貫動畫,和其餘處理。
  • ObjectAnimator建立的targetObject,能夠傳入任何對象,原理是調用set方法,利用這個特性能夠實現不少自定義的效果有點和Scroller相似。

7.參考

相關文章
相關標籤/搜索