Android Alpha Rotate Translate Scale以及LayoutAnimaton動畫組合動畫家庭豪華套餐

說到動畫相信大家應該不陌生了吧Android動畫出現在API11 也就是說3.0之後的一些新特性好了不囉嗦在下面我們看下官方API文檔

這裏寫圖片描述

Android裏面的動畫主要分爲兩大類其實面試的時候也會問到

幀動畫

可以產生透明度的變化 位移 x y 改變角度進行旋轉 以及縮放等效果

補間動畫

:類似於電影一幀一幀按照一定的順序進行播放。

如果不清楚的可以看下郭神的博客 Android屬性動畫基礎用法

好了今天我介紹的主要分爲八個部分

1. AlphaAnmation
2. RotateAnimation
3.ScaleAnimation
4. TranslateAnimation
5. ValueAnimator
6. ObjectAnimator
7.組合動畫
8.LayoutAnimaton佈局動畫

AlphaAnimation(透明度動畫)

這裏寫圖片描述
上面的意思就二十說根據控制 透明度的優先級出現淡入淡出的效果 說白了就是產生透明度的變化!

按照這個思路我們先一個一個來,首先講一下透明度動畫實現點擊按鈕讓圖片從顯示到透明度變淺這樣的效果0-1表示從顯示到變淺 他的值越大便是透明度越高 0表示最清晰。看下它公共的構造方法

這裏寫圖片描述

這裏寫圖片描述

                case R.id.btn_alpha:
                final AlphaAnimation alpha = new AlphaAnimation(0, 1);
                //設置動畫時間3秒
                alpha.setDuration(3000);
                //播放之後持續
                alpha.setFillAfter(true);
                iv_anim.startAnimation(alpha);
                Log.i(TAG, "onClick:    AlphaAnimation");
                break;

這裏寫圖片描述

RotateAnimation(旋轉動畫)

下面是旋轉動畫看下官方API的介紹 ![這裏寫圖片描述](https://img-blog.csdn.net/20170112145808800?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTU5NTAzMjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 其控制的物體的旋轉的動畫。該旋轉發生在XY軸。可以指定點以用於旋轉,其中(0,0)是左上角點的中心。如果未指定,(0,0)是默認的座標。 公共的方法如下 ![這裏寫圖片描述](https://img-blog.csdn.net/20170112150101273?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTU5NTAzMjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) fromDegrees 表示旋轉偏移的起始值 toDegrees 表示抵消值結束值[這裏寫圖片描述] (https://img-blog.csdn.net/20170112150825924?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTU5NTAzMjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

                case R.id.btn_rotate:
                //旋轉動畫
                RotateAnimation rotate = new RotateAnimation(0, 360, RotateAnimation.RELATIVE_TO_PARENT, 0.5f, RotateAnimation.RELATIVE_TO_PARENT, 0.5f);
                //設置旋轉時間
                rotate.setDuration(3000);
                //動畫重複次數2次 但是你開始的是三次本身執行了一次
                rotate.setRepeatCount(2);
                //設置動畫的模式 
                rotate.setRepeatMode(Animation.INFINITE);
                //設置持續動畫
                rotate.setFillAfter(true);
                Log.i(TAG, "重複次數: " + rotate.getRepeatCount());2 
                Log.i(TAG, "重複模式: " + rotate.getRepeatMode());
                iv_anim.startAnimation(rotate);
                Log.i(TAG, "onClick:  Hide iv_anim");
                break;
效果如下圖 ![這裏寫圖片描述](https://img-blog.csdn.net/20170112151058998?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTU5NTAzMjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

ScaleAnimation(縮放動畫)

還是看下官方API介紹

這裏寫圖片描述
它的意思就是 其控制的物體的尺度的動畫。可以指定點用於縮放的中心。放大或者縮小

然後看他公共構造的方法如下圖

這裏寫圖片描述

這裏寫圖片描述

fromXfloat:水平縮放在動畫開始
toXfloat:水平縮放,以在動畫的最後
fromYfloat:垂直縮放係數在動畫開始時
toYfloat:垂直縮放係數在動畫結束時現如下

                case R.id.btn_scale:
                //縮放動畫
                ScaleAnimation scale = new ScaleAnimation(1.5f, 0.5f, 1.5f, 0.5f);
                //設置縮放動畫的時間是3秒
                scale.setDuration(3000);
                scale.setFillAfter(true);
                // iv_anim.setAnimation(scale);
                iv_anim.startAnimation(scale);
                Log.i(TAG, "onClick:  ScaleAnimation ");
                // Toast.makeText(AnimationActivity.this,"你當前選擇的是旋轉動畫",Toast.LENGTH_LONG).show();
                break;

變化的兩種狀態由小變大

這裏寫圖片描述

這裏寫圖片描述

TranslateAnimation(平移/位移動畫)

官方介紹

這裏寫圖片描述

其控制的物體的位置的動畫。從一個座標移動到另外一個座標。

下面看下他的構造的方法

這裏寫圖片描述

fromXDelta  float:在X更改坐標動畫起始位置
toXDelta    float:在X更改坐標在動畫的結束位置
fromYDelta  float:Y軸坐標變化在動畫起始位置
toYDelta    float:Y軸坐標變化在動畫的結束位置


fromXType   int:指定fromXValue應如何解釋。一Animation.ABSOLUTEAnimation.RELATIVE_TO_SELFAnimation.RELATIVE_TO_PARENT的。
fromXValue  float:在X更改坐標動畫的開始適用。這個值可以是一個絕對數字,如果fromXType是絕對的,還是個(其中1.0為100%)
toXType int:指定toXValue應如何解釋。一Animation.ABSOLUTEAnimation.RELATIVE_TO_SELFAnimation.RELATIVE_TO_PARENT的。
toXValue    float:在X更改坐標在動畫的最後申請。這個值可以是一個絕對數字,如果toXType是絕對的,還是個(其中1.0為100%
fromYType   int:指定fromYValue應如何解釋。一Animation.ABSOLUTEAnimation.RELATIVE_TO_SELFAnimation.RELATIVE_TO_PARENT的。
fromYValue  float:Y中改變坐標在動畫的開始適用。這個值可以是一個絕對數字,如果fromYType是絕對的,還是個(其中1.0為100%)
toYType int:指定toYValue應如何解釋。一Animation.ABSOLUTEAnimation.RELATIVE_TO_SELFAnimation.RELATIVE_TO_PARENT的。
toYValue    float:Y軸坐標變化在動畫的最後申請。這個值可以是一個絕對數字,如果toYType是絕對的,還是個(其中1.0為100%)

實現的代碼如下
主要表示從0-180之間進行移動 然後從0到260又開始平移

                case R.id.btn_translate:
                //位移動畫
                TranslateAnimation translate = new TranslateAnimation(0, 180, 0, 260);
                translate.setDuration(3000);
                iv_anim.startAnimation(translate);
                Log.i(TAG, "onClick:  TranslateAnimation");
                break;

看下平移的距離如下所示

這裏寫圖片描述

這裏寫圖片描述

ValueAnimator

(屬性動畫)

看下官方API介紹
這裏寫圖片描述

這個類提供了運行的計算值,動畫,並將它們設置在目標對象上動畫的簡單時序引擎。
有所有動畫使用單個定時脈衝。在自定義處理程序運行,以確保變化在UI線程上發生。
默認情況下,ValueAnimator使用非線性時間內插,通過 AccelerateDecelerateInterpolator類,這將加速減速和出動畫的。也就是非線性運動,這種行為可以通過調用改變 setInterpolator(TimeInterpolator)。

官方的例子自己可以去看
Animators can be created from either code or resource files. Here is an example of a ValueAnimator resource file:

<animator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:valueFrom="1"
    android:valueTo="0"
    android:valueType="floatType"
    android:repeatCount="1"
    android:repeatMode="reverse"/>
It is also possible to use a combination of PropertyValuesHolder and Keyframe resource tags to create a multi-step animation. Note that you can specify explicit fractional values (from 0 to 1) for each keyframe to determine when, in the overall duration, the animation should arrive at that value. Alternatively, you can leave the fractions off and the keyframes will be equally distributed within the total duration:
<animator xmlns:android="http://schemas.android.com/apk/res/android"
          android:duration="1000"
          android:repeatCount="1"
          android:repeatMode="reverse">
    <propertyValuesHolder>
        <keyframe android:fraction="0" android:value="1"/>
        <keyframe android:fraction=".2" android:value=".4"/>
        <keyframe android:fraction="1" android:value="0"/>
    </propertyValuesHolder>
</animator>

公共的方法
這裏寫圖片描述

getAnimatoredValue和個體getAnimatedValue(String propertyName)

這裏寫圖片描述

代碼如下

                case R.id.btn_value:
                //特點值針對數字做運算支持float int rgb object等
               // final ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400);
                final ValueAnimator valueAnimator=ValueAnimator.ofFloat(0f,500f,30f,300f);
                 //設置時間爲5秒
                valueAnimator.setDuration(5000);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        Float curValueFloat= (Float) animation.getAnimatedValue();
                        int curValue = curValueFloat.intValue();
                        Log.i(TAG, "curValue: " + curValue);         btn_value.layout(curValue,curValue,curValue+btn_value.getWidth(),btn_value.getHeight());
                    }

                });

這裏寫圖片描述

向上移動之後效果

這裏寫圖片描述

ObjectAnimator

看下官方的介紹

這裏寫圖片描述
看到這裏可以有同學就會問了?上面不是剛講了ValueAnimator,這個就是他的子類肯定裏面共享他的屬性和方法對,你說的一點沒錯!
該子類ValueAnimator為目標對象的動畫屬性的支持。這個類的構造函數帶參數的定義將被動畫以及將動畫屬性的名稱目標對象。適當的設置/獲取功能,然後內部確定和動畫將調用這些函數所必需的動畫屬性。

這裏與ValueAnimator有些方法一樣的
這裏寫圖片描述

這裏寫圖片描述
下面看代碼

             //透明度
                ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(tv_text,"alpha",1f,0f,1f);
               objectAnimator.setDuration(3000);
               objectAnimator.start();
                //旋轉
                ObjectAnimator objectAnimator2=ObjectAnimator.ofFloat(tv_text,"rotation",0f,720f);
               objectAnimator2.setDuration(3000);
                objectAnimator2.start();
                //平移位移
               float x=btn_object.getTranslationX();
                ObjectAnimator objectAnimator3=ObjectAnimator.ofFloat(tv_text,"translationX",x,-500f,x);
              objectAnimator3.setDuration(3000);
               objectAnimator3.start();

               ObjectAnimator objectAnimator4=ObjectAnimator.ofFloat(tv_text,"scaleY",1f,3f,1f);
               objectAnimator4.setDuration(3000);
               objectAnimator4.start();

組合動畫

這裏必須提到AnimationSet集合 ![這裏寫圖片描述](https://img-blog.csdn.net/20170112160905994?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTU5NTAzMjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 這個類在一組Animator指定的順序對象。動畫可設置在一起玩,按順序,或在指定的延遲之後。 有兩種不同的方法來增加動畫一個AnimatorSet:或者是playTogether()或 playSequentially()方法可以被調用以一次全部添加一組動畫,或者play(Animator)可以結合使用與方法Builder 類由一個以添加動畫之一。 它可以建立一個AnimatorSet與它的動畫之間的循環依賴。例如,一個動畫A1可以設立動漫A2,A3 A2前啟動之前,A3和A1之前。這種結構的結果是不確定的,但通常會導致沒有受影響的動畫的播放。由於這個原因(因為循環依賴不作反正邏輯意義),循環依賴應避免和動畫的依賴流動應該只在一個方向。 下面直接看代碼看TextView的組合動畫

 public void groupAnimation(){
        ObjectAnimator moveIn=ObjectAnimator.ofFloat(tv_text,"translationX",-500f,0f);
        ObjectAnimator rotate=ObjectAnimator.ofFloat(tv_text,"rotation",0f,360f);
        ObjectAnimator fadeOut=ObjectAnimator.ofFloat(tv_text,"alpha",1f,0f,1f);
        //  ObjectAnimator scale=ObjectAnimator.ofFloat(tv_text,"scaleY",)
        AnimatorSet animatorSet=new AnimatorSet();
        //從左往右淡入淡出 然後旋轉720度 
        animatorSet.play(rotate).with(fadeOut).after(moveIn);
        //設置動畫時間爲5秒
        animatorSet.setDuration(5000);
        //播放組合動畫
        animatorSet.start();
    }

先淡入淡出 然後從左往右平移 然後旋轉720度

淡入淡出
這裏寫圖片描述

從左往右平移
這裏寫圖片描述

旋轉720度
這裏寫圖片描述

LayoutAnimaton(佈局動畫)

官網API介紹

這裏寫圖片描述

佈局動畫控制器用於動畫佈局的,或視圖組的兒童。每個孩子使用相同的動畫,但他們中的每一個,動畫在不同的時間開始。佈局動畫控制器所使用的ViewGroup計算由每個孩子的動畫開始必須抵消延遲。延遲是用每個孩子的特點,像它的視圖組指數計算。本標準執行計算由子View在其父視圖組索引毫秒,乘以延遲。子類都應該重寫 getDelayForView(android.view.View)來實現計算的延遲的不同的方式。例如, GridLayoutAnimationController將計算的基礎上在它的父視圖組的兒童的列和行索引的延遲。用於計算每個兒童的動畫延遲信息存儲在一個實例 LayoutAnimationController.AnimationParameters中存儲的,本身ViewGroup.LayoutParams的視圖。
然後公共的構造方法

這裏寫圖片描述

可以設置佈局的順序 正常 倒敘

這裏寫圖片描述

看下實現的效果圖

這裏寫圖片描述

貼上完整代碼

package zm.jc.com.bmobsys;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.animation.AnimationUtils;
import android.view.animation.LayoutAnimationController;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by John on 2017/1/14.
 */

public class LayoutAnimationActivity extends AppCompatActivity {
    private ListView lv_layout_animation;
    private List<String> mList=new ArrayList<>();
    private ArrayAdapter<String> adapter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout_animation);
        lv_layout_animation= (ListView) findViewById(R.id.lv_layout_animation);
        for (int i=0;i<20;i++){
            mList.add("Bmod後端雲" +i);
        }
       adapter=new ArrayAdapter<String>(LayoutAnimationActivity.this,android.R.layout.simple_list_item_multiple_choice,mList);
       lv_layout_animation.setAdapter(adapter);
       //創建佈局動畫控制器
        LayoutAnimationController lac=new LayoutAnimationController(AnimationUtils.loadAnimation(LayoutAnimationActivity.this, R.anim.dialog_load_anim));
        //將listview與佈局動畫關聯
        lv_layout_animation.setLayoutAnimation(lac);
        //設置動畫的播放順序 這裏是按正常也可以設置倒序 隨機
        lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
        //啓動佈局動畫
        lv_layout_animation.startLayoutAnimation();

    }
}

dialog_load_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="360"
        android:toDegrees="0"
        android:duration="1400"
        android:startOffset="-1"
        android:repeatMode="restart"
        android:repeatCount="-1"/>

</set>
package zm.jc.com.bmobsys.anim;


import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import zm.jc.com.bmobsys.R;

/**
 * Created by John on 2017/1/12.
 */

public class AnimationActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG = "AnimationActivity";
    //透明度 位移 旋轉 縮放
    private Button btn_alpha, btn_translate, btn_rotate, btn_scale, btn_value,btn_object;
    private LinearLayout ll1;
     private TextView tv_text;
    private ImageView iv_anim;
    private static final int SEND_ANIMATION_STATUS = 0;
//    private Handler mHandler = new Handler() {
//        @Override
//        public void handleMessage(Message msg) {
//            super.handleMessage(msg);
//            switch (msg.what) {
//                case SEND_ANIMATION_STATUS:
//                    msg.arg1 = 0x1233;
//                    mHandler.sendEmptyMessage(msg.arg1);
//                    Log.i(TAG, "handleMessage: ------發送延遲消息------");
//                    break;
//            }
//        }
//    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_anim);
        initView();
        initClick();

    }

    private void initClick() {
        btn_alpha.setOnClickListener(this);
        btn_translate.setOnClickListener(this);
        btn_rotate.setOnClickListener(this);
        btn_scale.setOnClickListener(this);
        btn_value.setOnClickListener(this);
        btn_object.setOnClickListener(this);
        tv_text= (TextView) findViewById(R.id.tv_text);
        iv_anim.setOnClickListener(this);

        // ll1.setOnClickListener(this);


    }

    private void initView() {
        //ll1= (LinearLayout) findViewById(R.id.ll1);
        btn_alpha = (Button) findViewById(R.id.btn_alpha);
        btn_translate = (Button) findViewById(R.id.btn_translate);
        btn_rotate = (Button) findViewById(R.id.btn_rotate);
        btn_scale = (Button) findViewById(R.id.btn_scale);
        btn_value = (Button) findViewById(R.id.btn_value);
        btn_object = (Button) findViewById(R.id.btn_object);

        iv_anim = (ImageView) findViewById(R.id.iv_anim);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_alpha:
                //動畫集類似於Set
                //final  AnimatorSet animationSet=new AnimatorSet();
                final AlphaAnimation alpha = new AlphaAnimation(0, 1);
                //設置動畫時間3秒
                alpha.setDuration(3000);
                //播放之後持續
                alpha.setFillAfter(true);
                //iv_anim.setAnimation(alpha);
                iv_anim.startAnimation(alpha);
                Log.i(TAG, "onClick:    AlphaAnimation");
                break;
            case R.id.btn_translate:
                //位移動畫
                TranslateAnimation translate = new TranslateAnimation(0, 160, 0, 240);
                translate.setDuration(3000);
                // iv_anim.setAnimation(translate);
                iv_anim.startAnimation(translate);
                Log.i(TAG, "onClick:  TranslateAnimation");
                break;
            case R.id.btn_scale:
                //縮放動畫
                ScaleAnimation scale = new ScaleAnimation(1.5f, 0.5f, 1.5f, 0.5f);
                //設置縮放動畫的時間是3秒
                scale.setDuration(3000);
                scale.setFillAfter(true);
                // iv_anim.setAnimation(scale);
                iv_anim.startAnimation(scale);
                Log.i(TAG, "onClick:  ScaleAnimation ");
                // Toast.makeText(AnimationActivity.this,"你當前選擇的是旋轉動畫",Toast.LENGTH_LONG).show();
                break;
            case R.id.btn_rotate:
                //旋轉動畫
                RotateAnimation rotate = new RotateAnimation(0, 360, RotateAnimation.RELATIVE_TO_PARENT, 0.5f, RotateAnimation.RELATIVE_TO_PARENT, 0.5f);
                rotate.setDuration(3000);
                rotate.setRepeatCount(2);
                rotate.setRepeatMode(Animation.INFINITE);
                rotate.setFillAfter(false);
//                Message msg = new Message();
//                msg.arg1 = 0x1233;
//                mHandler.sendEmptyMessage(msg.arg1);
//               // mHandler.sendEmptyMessageAtTime(msg.arg1,400);
//                // rotate.setStartTime(2000);
                Log.i(TAG, "重複次數: " + rotate.getRepeatCount());
                Log.i(TAG, "重複模式: " + rotate.getRepeatMode());

                iv_anim.startAnimation(rotate);
                Log.i(TAG, "onClick:  Hide iv_anim");
                AnimatorSet animationSet = new AnimatorSet();
//                rotate.setAnimationListener(new Animation.AnimationListener() {
//                    @Override
//                    public void onAnimationStart(Animation animation) {
//                        animation.start();
//                        Log.i(TAG," onAnimation  Start");
//
//                    }
//
//                    @Override
//                    public void onAnimationEnd(Animation animation) {
//                       animation.cancel();
//                        Log.i(TAG," onAnimation  cancel");
//                    }
//
//                    @Override
//                    public void onAnimationRepeat(Animation animation) {
//
//
//                    }
//                });
//
//               animationSet.addListener(new Animator.AnimatorListener() {
//                    @Override
//                    public void onAnimationStart(Animator animation) {
//
//                    }
//
//                    @Override
//                    public void onAnimationEnd(Animator animation) {
//                            startActivity(new Intent(AnimationActivity.this,MainActivity.class));
//                    }
//
//                    @Override
//                    public void onAnimationCancel(Animator animation) {
//
//                    }
//
//                    @Override
//                    public void onAnimationRepeat(Animator animation) {
//
//                    }
//                });
                // ll1.setAnimation(animationSet);
                break;
            case R.id.btn_value:
                //特點值針對數字做運算支持float int rgb object等
               // final ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400);
                final ValueAnimator valueAnimator=ValueAnimator.ofFloat(0f,500f,30f,300f);
               // valueAnimator.setFloatValues(3.0f);
                valueAnimator.setDuration(5000);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        Float curValueFloat= (Float) animation.getAnimatedValue();
                        int curValue = curValueFloat.intValue();
                        Log.i(TAG, "curValue: " + curValue);
                        btn_value.layout(curValue,curValue,curValue+btn_value.getWidth(),btn_value.getHeight());
                    }

                });

//                valueAnimator.addListener(new Animator.AnimatorListener() {
//                    @Override
//                    public void onAnimationStart(Animator animation) {
//
//                    }
//
//                    @Override
//                    public void onAnimationEnd(Animator animation) {
//                        valueAnimator.end();
//
//                    }
//
//                    @Override
//                    public void onAnimationCancel(Animator animation) {
//                        valueAnimator.cancel();
//
//                    }
//
//                    @Override
//                    public void onAnimationRepeat(Animator animation) {
//
//
//                    }
//                });
                valueAnimator.start();
                Log.i(TAG, "onClick:   ValueAnimator");
                break;
            case R.id.btn_object:
                groupAnimation();
                break;
//                //透明度
//                ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(tv_text,"alpha",1f,0f,1f);
//                objectAnimator.setDuration(3000);
//                objectAnimator.start();
//                 //旋轉
//                ObjectAnimator objectAnimator2=ObjectAnimator.ofFloat(tv_text,"rotation",0f,360f);
//                objectAnimator2.setDuration(3000);
//                objectAnimator2.start();
//                //平移位移
//                float x=btn_object.getTranslationX();
//                ObjectAnimator objectAnimator3=ObjectAnimator.ofFloat(tv_text,"translationX",x,-500f,x);
//                objectAnimator3.setDuration(3000);
//                objectAnimator3.start();
//
//                ObjectAnimator objectAnimator4=ObjectAnimator.ofFloat(tv_text,"scaleY",1f,3f,1f);
//                objectAnimator4.setDuration(3000);
//                objectAnimator4.start();
                //iv_anim.startAnimation(objectAnimator);
        }


    }
    public void groupAnimation(){
        ObjectAnimator moveIn=ObjectAnimator.ofFloat(tv_text,"translationX",-500f,0f);
        ObjectAnimator rotate=ObjectAnimator.ofFloat(tv_text,"rotation",0f,360f);
        ObjectAnimator fadeOut=ObjectAnimator.ofFloat(tv_text,"alpha",1f,0f,1f);
        //  ObjectAnimator scale=ObjectAnimator.ofFloat(tv_text,"scaleY",)
        AnimatorSet animatorSet=new AnimatorSet();
        animatorSet.play(rotate).with(fadeOut).after(moveIn);
        animatorSet.setDuration(5000);
        animatorSet.start();


    }
    private ValueAnimator doRepeatAnim(){
        final ValueAnimator animator=ValueAnimator.ofFloat(0f,300f,40f,450f);
        animator.setDuration(1000);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Float curValueFloat= (Float) animation.getAnimatedValue();
                int curf=curValueFloat.intValue();
                btn_value.layout(btn_value.getLeft(),curf,btn_value.getRight(),curf+btn_value.getHeight());
//               ValueAnimator va=animator.clone();
//                //延遲3秒
//                va.setStartDelay(3000);
               // va.start();
            }
        });
        animator.setRepeatMode(ValueAnimator.REVERSE);
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.start();
          return animator;

    }
//    @Override
//    protected void onDestroy() {
//        super.onDestroy();
//        mHandler.removeCallbacks(runnable);
//    }
}

佈局文件activity_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="20dp"
    android:layout_margin="10dp"
    android:orientation="vertical">
    <Button
        android:layout_marginTop="10dp"
        android:id="@+id/btn_alpha"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_gravity="center"
        android:background="@drawable/btn_shape"
        android:text="Alpha動畫"/>
    <Button
        android:layout_marginTop="10dp"
        android:id="@+id/btn_rotate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_gravity="center"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:background="@drawable/btn_shape"
        android:text="Rotate動畫"/>
    <Button
        android:id="@+id/btn_translate"
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_gravity="center"
        android:background="@drawable/btn_shape"
        android:text="Translate動畫"/>
    <Button
        android:id="@+id/btn_scale"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_gravity="center"
        android:background="@drawable/btn_shape"
        android:text="Scale動畫"/>
    <Button
        android:id="@+id/btn_value"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_gravity="center"
        android:background="@drawable/btn_shape"
        android:text="Value動畫"/>
    <Button
        android:id="@+id/btn_object"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_gravity="center"
        android:background="@drawable/btn_shape"
        android:text="Object動畫"/>
    <ImageView
        android:id="@+id/iv_anim"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:scaleType="fitCenter"
        android:src="@mipmap/ic_launcher"/>
    <TextView
        android:layout_marginTop="30dp"
        android:id="@+id/tv_text"
        android:layout_width="match_parent"
        android:text="Alpha Rotateshhhdsf"
        android:gravity="center"
        android:layout_height="wrap_content" />

</LinearLayout>

參考文章郭神 http://chuansong.me/n/752021951131
高級動畫參考 http://chuansong.me/n/864251151731](http://chuansong.me/n/864251151731)

轉載請請註明出處http://blog.csdn.net/qq_15950325/article/details/54379148同時歡迎新老司機前來開車體驗哈哈點擊直接加入
瘋狂Android進階之旅

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