天天看點

Android 屬性動畫進階總結篇(篇4)

前言:學習了郭霖大神的 屬性動畫進階用法相關的部落格,在學習的同時也順便做筆記

1.在文章的開始首先貼上郭霖 大神關于 屬性動畫進階用法相關的部落格位址:

http://blog.csdn.net/sinyu890807/article/details/44171115

2.總結下所學習的技術點:

在篇2博文中記錄了系統提供的一部分 “時間內插補點器”, 這裡再深入學習下:
  1. 系統預設的時間內插補點器 為 AccelerateDecelerateInterpolator這一實作類,看下面源碼截圖
    Android 屬性動畫進階總結篇(篇4)
  2. 系統提供的屬性動畫的各類內插補點器中都繼承自BaseInterpolator類,而BaseInterpolator類實作于Interpolator接口,Interpolator接口繼承自TimeInterpolator接口(targetSdkVersion 23) , 就是這麼一系列的繼承實作關系,可以看到在TimeInterpolator接口中隻有 “getInterpolation”這個方法,在系統提供的各類內插補點器中皆有對該 “getInterpolation”方法 不同的實作,當系統提供的不滿足需求的時候,可以實作自定義的內插補點器.
  3. 內插補點器的自定義實作可以參考郭神 的部落格,絕對讓你受寵若驚!!
  4. TimeInterpolator(時間內插補點器)根據流逝的時長百分比計算出目前屬性值改變的百分比,而 篇3 學到的TypeEvaluator(類型估值算法,即估值器)則根據時間內插補點器計算得到的屬性百分比來計算目前屬性改變的值并且傳回, 主要的api有
    /**
         * 系統提供的時間內插補點器,自定義內插補點器可以實作Interpolator 或 TimeInterpolator,
         * 重寫其getInterpolation方法
         */
        public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
    
            public LinearInterpolator() {
            }
    
            public LinearInterpolator(Context context, AttributeSet attrs) {
            }
    
            public float getInterpolation(float input) {
                return input;
            }
    
            /** @hide */
            @Override
            public long createNativeInterpolator() {
                return NativeInterpolatorFactoryHelper.createLinearInterpolator();
            }
        }
    
    
    
        /**
         * 系統提供的估值器,自定義估值器可以實作TypeEvaluator,重寫其evaluate方法
         */
        public class IntEvaluator implements TypeEvaluator<Integer> {
    
        public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
            int startInt = startValue;
            return (int)(startInt + fraction * (endValue - startInt));
        }
    }
    
    
               
關于屬性動畫ViewPropertyAnimator的用法

由于大多數時候仍然是對View進行動畫操作的,是以為了更加簡便靈活的實作動畫,ViewPropertyAnimator可以幫我們一行代碼簡單實作,看下我們之前實作動畫的寫法:

ObjectAnimator translationX = ObjectAnimator.ofFloat(view, "translationX", 0, 500F);
translationX.setInterpolator(new AccelerateDecelerateInterpolator());
translationX.setDuration(300);
translationX.start();
           

上面的code雖在api的展示上已經非常簡潔,是不是并不好了解,再看下下面的代碼,實作的動畫效果和上面一樣:

ViewPropertyAnimator.animate(view).translationX(500)
                     .setInterpolator(new AccelerateDecelerateInterpolator())
                     .setDuration(300);
           

上面的code在展示上更加簡潔,而且非常容易了解,animate方法需要傳入一個View對象,然後傳回ViewPropertyAnimator對象,緊接着對ViewPropertyAnimator對象 進行動畫效果/時間內插補點器/動畫執行時長/等等的設定,每個api的傳回結果都是ViewPropertyAnimator 對象,設定完成之後也不用start動畫,系統會幫我們隐式啟動動畫. 就是這麼的爽歪歪…

可以使用連綴的寫法将動畫集合起來,動畫效果同時執行

ViewPropertyAnimator.animate(null).x(100).y(100)
                         .rotation(200).alpha(0)
                         .setDuration(100);
           

3.總結:

  • 1.了解屬性動畫內插補點器,以及內插補點器和估值器的用處以及如何協同工作;
  • 2.了解ViewPropertyAnimator的用法,簡潔易懂;
  • 3.假期結束的第1天,時間差還沒回過神來 …郁悶

屬性動畫類别的的博文:

  • 屬性動畫與補間動畫總結篇(篇1): http://blog.csdn.net/yk377657321/article/details/52683094
  • Android 屬性動畫進階篇(篇2): http://blog.csdn.net/yk377657321/article/details/52746328
  • Android 屬性動畫進階總結篇(篇3): http://blog.csdn.net/yk377657321/article/details/52761211
  • Android 屬性動畫進階總結篇(篇4):http://blog.csdn.net/yk377657321/article/details/52761453