View動畫學習總結

佈局動畫

android:animateLayoutChanges="true"
在4.1 JellyBean上還有一個增強的功能,可以在容器內的子view的layout發生變化時也播放動畫,用法如下。

LayoutTransition transition = container.getLayoutTransition();
transition.enableTransitionType(LayoutTransition.CHANGING);

Animation set

先後次序地執行動畫

ObjectAnimator topFlipAnimator = ObjectAnimator.ofFloat(view, "topFlip", - 30);
        topFlipAnimator.setStartDelay(200);
        topFlipAnimator.setDuration(1000);
        ObjectAnimator flipRotationAnimator = ObjectAnimator.ofFloat(view, "flipRotation", 270);
        flipRotationAnimator.setStartDelay(200);
        flipRotationAnimator.setDuration(1000);
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playSequentially(bottomFlipAnimator, flipRotationAnimator, topFlipAnimator);
        animatorSet.setStartDelay(1000);
        animatorSet.start();

PropertyValuesHolder

在同一個動畫中,需要共享動畫的開始時間、結束時間、Interpolator 等等一系列的設定

PropertyValuesHolder topFlipHolder = PropertyValuesHolder.ofFloat("topFlip", -30);
        PropertyValuesHolder flipRotationHolder = PropertyValuesHolder.ofFloat("flipRotation", 270);
        ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view, bottomFlipHolder, topFlipHolder, flipRotationHolder);
        animator.setStartDelay(1000);
        animator.setDuration(1000);
        animator.start();*/

Keyframe

使用 PropertyValuesHolder.ofKeyframe() 來把一個屬性拆分成多段,執行更加精細的屬性動畫

Keyframe keyframe1 = Keyframe.ofFloat(0, 0);
        Keyframe keyframe2 = Keyframe.ofFloat(0.1f, 1.5f * distance);
        Keyframe keyframe3 = Keyframe.ofFloat(0.9f, 0.6f * distance);
        Keyframe keyframe4 = Keyframe.ofFloat(1, distance);
        PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe("translationX", keyframe1, keyframe2, keyframe3, keyframe4);
        ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view, holder);
        animator.setStartDelay(1000);
        animator.setDuration(2000);
        animator.start();

TypeEvaluator

class PointFEvaluator implements TypeEvaluator<PointF> {
        @Override
        public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
            float x = startValue.x + (endValue.x - startValue.x) * fraction;
            float y = startValue.y + (endValue.y - startValue.y) * fraction;
            return new PointF(x, y);
        }
    }

除了 ViewPropertyAnimator 和 ObjectAnimator,還有第三個選擇是 ValueAnimator。ValueAnimator 並不常用,因爲它的功能太基礎了。ValueAnimator 是 ObjectAnimator 的父類,實際上,ValueAnimator 就是一個不能指定目標對象版本的 ObjectAnimator。ObjectAnimator 是自動調用目標對象的 setter 方法來更新目標屬性的值,以及很多的時候還會以此來改變目標對象的 UI,而 ValueAnimator 只是通過漸變的方式來改變一個獨立的數據,這個數據不是屬於某個對象的,至於在數據更新後要做什麼事,全都由你來定,你可以依然是去調用某個對象的 setter 方法(別這麼爲難自己),也可以做其他的事,不管要做什麼,都是要你自己來寫的,ValueAnimator 不會幫你做。功能最少、最不方便,但有時也是束縛最少、最靈活。比如有的時候,你要給一個第三方控件做動畫,你需要更新的那個屬性沒有 setter 方法,只能直接修改,這樣的話 ObjectAnimator 就不靈了啊。怎麼辦?這個時候你就可以用 ValueAnimator,在它的 onUpdate() 裏面更新這個屬性的值,並且手動調用 invalidate()。

發佈了35 篇原創文章 · 獲贊 2 · 訪問量 4375
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章