Android Alpha Rotate Translate Scale以及LayoutAnimaton动画组合动画家庭豪华套餐

来源:互联网 发布:navicat 修改表中数据 编辑:程序博客网 时间:2024/04/29 16:18

说到动画相信大家应该不陌生了吧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的介绍![这里写图片描述](http://img.blog.csdn.net/20170112145808800?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTU5NTAzMjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)其控制的物體的旋轉的動畫。該旋轉發生在XY轴。可以指定點以用於旋轉,其中(0,0)是左上角點的中心。如果未指定,(0,0)是默認的坐标。公共的方法如下![这里写图片描述](http://img.blog.csdn.net/20170112150101273?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTU5NTAzMjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)fromDegrees 表示旋转偏移的起始值 toDegrees 表示抵消值结束值[这里写图片描述](http://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;
效果如下图![这里写图片描述](http://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集合![这里写图片描述](http://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进阶之旅

0 0
原创粉丝点击