Android 動畫雜談(一)

視圖動畫:

視圖動畫產生的動畫,並不能改變事件響應的位置,它只是單純地修改了顯示,如果使用視圖動畫,那麼按鈕的實際點擊有效區域還是在原來的地方,點擊移動後的地方時不會有點擊時間發生的。

TranslateAnimation ta = new TranslateAnimation(0,200,0,300);
ta.setDuration(1000);
ta.setFillAfter(true);
view.startAnimation(ta);

而屬性動畫則不一樣,由於它真實改變了一個View的屬性,所以事件響應的區域也同樣發生了改變,這時候點擊移動後的按鈕,就會響應點擊事件了

ObjectAnimator animator = ObjectAnimator.ofFloat(view,"translationX",300);
        animator.setDuration(300);
        animator.start();

PropertyValuesHolder

針對同一對象的多個屬性,要同時作用多種動畫,可以使用PropertyValuesHolder來實現,比如下面的在平移過程中,需要同時改變X,Y軸的縮放,可以這樣實現:

PropertyValuesHolder p1 =PropertyValuesHolder.ofFloat("translation",300f);
PropertyValuesHolder p2 =PropertyValuesHolder.ofFloat("scaleX",1f,0,1f);
PropertyValuesHolder p3 =PropertyValuesHolder.ofFloat("scaleY",1f,0,1f);
ObjectAnimator.ofPropertyValuesHolder(view,p1,p2,p3).setDuration(1000).start();

使用方法類似視圖動畫的AnimationSet的使用。

動畫事件的監聽


        ObjectAnimator anima  = ObjectAnimator.ofFloat(view,"alpha",0.5f);
        anima.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {

            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });

其各方法的含義根據方法名很顯然知道。當然,大部分的時候,我們都只關心onAnimationEnd 事件,所以可以如下這樣使用

        ObjectAnimator anima  = ObjectAnimator.ofFloat(view,"alpha",0.5f);
     anima.addListener(new AnimatorListenerAdapter() {
         @Override
         public void onAnimationEnd(Animator animation) {
             super.onAnimationEnd(animation);
         }
     });

可以自由選擇我們必要的事件進行監聽。

AnimatorSet

爲了實現更爲精確的順序控制

  ObjectAnimator animator1 = ObjectAnimator.ofFloat(view,"translationX",300f);
        ObjectAnimator animator2 = ObjectAnimator.ofFloat(view,"scaleX",1f,0f,1f);
        ObjectAnimator animator3 = ObjectAnimator.ofFloat(view,"scaleY",1f,0f,1f);
        AnimatorSet set = new AnimatorSet();
        set.setDuration(1000);
        // 同時
        set.playTogether(animator1, animator2, animator3);
        // 按順序
        set.playSequentially(animator1,animator2,animator3);
        /*
        *  或者通過下面的方法去控制
        * set.play().with()
        * set.play().before()
        * set.play().after()
        * */
        set.start();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章