Android動畫框架示例

本文將按視圖動畫和屬性動畫講解。
android3.0之前視圖動畫一家獨大,使用也非常簡單,提供了AlphaAnimation(透明度),RotateAnimation(旋轉動畫),TranslateAnimation(平移動畫),ScaleAnimation(放大縮小動畫)。android3.0之後,出現屬性動畫,由於視圖動畫交互事件的缺陷性(視圖動畫後事件的相應依舊在原動畫位置),屬性動畫得到了開發者的青睞。

一、視圖動畫

1.透明度動畫

/**
     * 透明度動畫
     */
    private void alphaAnim(){
        AlphaAnimation anim=new AlphaAnimation(1.0f,0.5f);
        anim.setDuration(500);
        slideTv.startAnimation(anim);
    }

2.旋轉動畫

    /**
     * 旋轉動畫
     */
    private void rotateAnim(){
        //參數:起始角度,終止角度,中心的座標[0,0]
        RotateAnimation anim= new RotateAnimation(90,180,0,0);
        anim.setDuration(500);
        slideTv.startAnimation(anim);
    }

3.平移動畫

    /**
     * 平移動畫
     */
    private void translateAnim(){
        //參數:x起始位置,x終止位置,y起始位置,y終止位置
        TranslateAnimation anim= new TranslateAnimation(0,100,0,300);
        anim.setDuration(500);
        slideTv.startAnimation(anim);
    }

4.放大縮小

     /**
     * 放大縮小動畫
     */
    private void scaleAnim(){
        //參數:x起始倍數,x終止倍數,y倍數位置,y終止倍數。1爲原始,大於1放大,小於1縮小
        ScaleAnimation anim= new ScaleAnimation(1,1.5f,1,1.5f);
        anim.setDuration(500);
        slideTv.startAnimation(anim);
    }

5.AnimationSet動畫集,同時執行放大,縮小,透明度等動畫

    private void animSet(){
        AnimationSet anim= new AnimationSet(true);
        anim.setDuration(500);

        ScaleAnimation Sanim= new ScaleAnimation(1,1.5f,1,1.5f);
        Sanim.setDuration(500);
        anim.addAnimation(Sanim);

        TranslateAnimation Tanim= new TranslateAnimation(0,100,0,300);
        Tanim.setDuration(500);
        anim.addAnimation(Tanim);
        slideTv.startAnimation(anim);
    }

這裏寫圖片描述

二、屬性動畫

1.ObjectAnimatior是屬性動畫框架重要的實行類,需要注意的是屬性動畫的實施需要對象的屬性必須有set和get方法,android內部會通過反射機制調用到set函數對對象的屬性進行修改。
先通過ObjectAnimtor實現上述的透明度,旋轉,平移,放大縮小:

 /**
     * 透明度動畫
     */
    private void objAlphaAnim(){
        /**
         * 屬性值只有:alpha
         */
        ObjectAnimator anim=ObjectAnimator.ofFloat(slideTv,"alpha",0.5f);
        anim.setDuration(500);
        anim.start();
    }

    /**
     * 旋轉動畫
     */
    private void objRotateAnim(){
        /**
         * 表示橫向中心旋轉360
         * 屬性值:rotationX,rotationY,rotation
         */
        ObjectAnimator anim=ObjectAnimator.ofFloat(slideTv,"rotationX",360);
        anim.setDuration(1500);
        anim.start();
    }
    /**
     * 平移動畫
     */
    private void objTranslateAnim(){
        /**
         * 表示從距離當前位置200處向距離當前100處移動,然後從距離當前100處移動到距離當前三百處
         * 屬性值:translationX,translationY
         */
        ObjectAnimator anim=ObjectAnimator.ofFloat(slideTv,"translationX",200,100,300);
        anim.setDuration(1500);
        anim.start();
    }
    /**
     * 放大縮小動畫
     */
    private void objScaleAnim(){
        /**
         * 屬性值:scaleX,scaleY
         */
        ObjectAnimator anim=ObjectAnimator.ofFloat(slideTv,"scaleX",0.2f);
        anim.setDuration(500);
        anim.start();
    }

2.PropertyValuesHolder
該它類似視圖動畫中的動畫集AnimationSet,可以實現多種動畫一起播放,譬如:x,y軸的同時位移,如果只使用ObjectAnimation只能順序的播放x方向位移,再播放y方向的位移。

    private void objAnimSet(){
        PropertyValuesHolder pvh1=PropertyValuesHolder.ofFloat("scaleX",1.2f);
        PropertyValuesHolder pvh2=PropertyValuesHolder.ofFloat("scaleY",1.2f);
        PropertyValuesHolder pvh3=PropertyValuesHolder.ofFloat("translationX",100);
        PropertyValuesHolder pvh4=PropertyValuesHolder.ofFloat("translationY",100);
        PropertyValuesHolder pvh5=PropertyValuesHolder.ofFloat("alpha",0.3f);
        ObjectAnimator.ofPropertyValuesHolder(slideTv,pvh1,pvh2,pvh3,pvh4,pvh5).setDuration(2000).start();
    }

這裏寫圖片描述

3.ValueAnimtor
ValueAnimtor本身不提供任何的動畫效果,ObjectAnimtor繼承自ValueAnimtor,ValueAnimtor更像一個數值監聽器,監聽數值變化完成動畫效果。
我們寫一個需求:當滑動view時,不斷變化其背景色,效果圖:
這裏寫圖片描述

代碼:

    private void valueAnim(int offSetX){
        ValueAnimator anim=ValueAnimator.ofFloat(0,offSetX);
        anim.setDuration(300);
        anim.start();
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                if((float)animation.getAnimatedValue()%3==0){
                    slideTv.setBackgroundResource(R.color.test1);
                }else if((float)animation.getAnimatedValue()%3==1){
                    slideTv.setBackgroundResource(R.color.test2);
                }else {
                    slideTv.setBackgroundResource(R.color.test3);
                }
            }
        });
    }

4.AnimatorSet
注意AnimatorSet和視圖動畫中的AnimationSet拼寫是不一樣的。但它和視圖動畫都能同時完成幾個動畫效果。它能和PropertyValuesHolder達到同樣的效果,且比PropertyValuesHolder有更豐富的效果,譬如:通過playTogether,playSequentially等對動畫播放順序進行精確控制。

    private void objAnimSet(){
        ObjectAnimator anim1=ObjectAnimator.ofFloat(slideTv,"scaleX",1.2f);
        ObjectAnimator anim2=ObjectAnimator.ofFloat(slideTv,"translationY",300);
        ObjectAnimator anim3=ObjectAnimator.ofFloat(slideTv,"alpha",0.2f,1f);

        AnimatorSet set=new AnimatorSet();
        set.setDuration(1000);
        set.playTogether(anim1,anim2,anim3);
        set.start();
    }

5.view的animate方法
我們也可以直接通過view.animate()方法直接驅動動畫,它相當於屬性動畫的簡寫方式。

   private void objViewSet(){
        slideTv.animate().alpha(0.2f).translationY(400).withStartAction(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this,"動畫開始",Toast.LENGTH_SHORT).show();
            }
        }).withEndAction(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this,"end",Toast.LENGTH_SHORT).show();
            }
        }).setDuration(3000).start();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章