1.介紹php
Android3.0推出了全新的AnimationAPI,使用起來很方便,可是不能在3.0如下版本使用,NineOldAndroids是一個能夠在任意Android版本上使用的AnimationAPI,API和Android3.0中的相似。
html
類名與官方的API是對應的,只是包名爲com.nineoldandroids.animation
。java
首先導入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
類。數組
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
是建立同時執行的動畫。動畫
ObjectAnimator
是動畫對象,經過ObjectAnimator提供的一系列of開頭的靜態方法建立。
建立通常須要傳入三個參數
target
,Object類型,可不是View哦PropertyName
,String類型或Property類型,用於描述target中的屬性ofInt()
就是int數組 ObjectAnimator
原理是這樣的:會調用target
的set
方法,設置PropertyName
的值,這個值的計算方式是,根據Duration時長和第三個參數數組來計算出來當前時間的值。而後調用set
方法設置進去。例如上面更改背景顏色的實例,PropertyName
是backgroundColor
,數組是兩個顏色值,運行動畫就會根據Duration計算當前的顏色值,調用target
的setBackgroundColor
方法設置進去,從而改變了背景顏色。
再看改AnimatorSet
的實例,PropertyName
是rotationX
、translationX
之類的,這幾個屬性是在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); }
NineOldAndroids的API與官方的API基本一致,使用很方便。可以輕鬆實現各類酷炫動畫效果。
ViewPropertyAnimator
就能夠了,能夠設置動畫監聽器,實現連貫動畫,和其餘處理。ObjectAnimator
建立的target
是Object
,能夠傳入任何對象,原理是調用set
方法,利用這個特性能夠實現不少自定義的效果有點和Scroller
相似。