android 属性动画之 ObjectAnimator

来源:互联网 发布:苹果手机健身软件 编辑:程序博客网 时间:2024/05/21 08:37

一、ObjectAnimator展示单个动画效果

1、translate

    //view从原始位置减速下移500,无限循环    private void translationY1(View view) {        ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationY", 0f, 500f);        animator.setInterpolator(new DecelerateInterpolator());//减速        animator.setRepeatCount(-1);//设置动画重复次数,-1表示无限        animator.setRepeatMode(ValueAnimator.REVERSE);//设置动画循环模式        animator.setDuration(1000);        animator.start();    }
    // view从屏幕顶端下移500    private void translationY(View view){        ObjectAnimator animator = ObjectAnimator.ofFloat(view,"Y",0f,500f);        animator.setDuration(1000);        animator.start();    }

2、scale

    //view从原始尺寸缩小为0    private void scale_smalller(View view){        ObjectAnimator animatorX = ObjectAnimator.ofFloat(view, "scaleX", 1f, 0f);        ObjectAnimator animatorY = ObjectAnimator.ofFloat(view, "scaleY", 1f, 0f);        AnimatorSet animatorSet = new AnimatorSet();        animatorSet.setDuration(2000);        animatorSet.play(animatorX).with(animatorY);//两个动画同时开始        animatorSet.start();    }
    //view从原始尺寸变大为原来2倍大    private void scale_bigger(View view){        ObjectAnimator animatorX = ObjectAnimator.ofFloat(view, "scaleX", 1f, 2f);        ObjectAnimator animatorY = ObjectAnimator.ofFloat(view, "scaleY", 1f, 2f);        AnimatorSet animatorSet = new AnimatorSet();        animatorSet.setDuration(2000);        animatorSet.play(animatorX).with(animatorY);//两个动画同时开始        animatorSet.start();    }
    //view先从原始尺寸缩小为0,再变大为原来2倍大    private void scaleToSmallToBig(View view){        ObjectAnimator animatorX1 = ObjectAnimator.ofFloat(view, "scaleX", 1f, 0f);        ObjectAnimator animatorY1 = ObjectAnimator.ofFloat(view, "scaleY", 1f, 0f);        ObjectAnimator animatorX2 = ObjectAnimator.ofFloat(view, "scaleX", 0f, 2f);        ObjectAnimator animatorY2 = ObjectAnimator.ofFloat(view, "scaleY", 0f, 2f);        AnimatorSet animatorSet = new AnimatorSet();        animatorSet.setDuration(3000);        animatorSet.play(animatorX1).with(animatorY1);        animatorSet.play(animatorX2).with(animatorY2).after(animatorX1);        animatorSet.start();    }

3、alpha

    //view透明度从1变到0.3    private void changeAlpha(View view) {        ObjectAnimator animator = ObjectAnimator.ofFloat(view, "alpha", 1f, 0.3f);        animator.setDuration(1000);        animator.start();    }

4、rotate

    //view顺时针旋转360度    private void rotate(View view){        ObjectAnimator animator = ObjectAnimator .ofFloat(view, "rotation", 0f, 360f);        animator.setDuration(1000);        animator.start();    }

二、ObjectAnimator展示多个动画效果

1、按顺序播放动画

    //按顺序播放动画:view先右移500,再下移500,最后旋转360,每个动画耗时0.5s    private void playAnimatorSequentially(View view){        ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "translationX", 0f, 500f);        ObjectAnimator animator2 = ObjectAnimator.ofFloat(view, "translationY", 0f, 500f);        ObjectAnimator animator3 = ObjectAnimator .ofFloat(view, "rotation", 0f, 360f);        AnimatorSet animatorSet = new AnimatorSet() ;        animatorSet.playSequentially(animator1,animator2,animator3);        animatorSet.setDuration(500);        animatorSet.start();    }

2、若干动画同时进行

     //3个动画同时进行,一共耗时2s    private void playAnimatorTogether(View view){        ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "translationX", 0f, 500f);        ObjectAnimator animator2 = ObjectAnimator.ofFloat(view, "translationY", 0f, 500f);        ObjectAnimator animator3 = ObjectAnimator .ofFloat(view, "rotation", 0f, 360f);        AnimatorSet set =new AnimatorSet();        set.playTogether(animator1,animator2,animator3);        set.setDuration(2000);        set.start();    }

三、为动画添加监听事件

方式1(四个方法全实现):

    //为动画添加监听事件方式一(四个方法全实现)    private void addAnimatorListener1(View view){        ObjectAnimator animator = ObjectAnimator.ofFloat(view, "Y", 0f, 1000f);        animator.addListener(new Animator.AnimatorListener() {            @Override            public void onAnimationStart(Animator animator) {                //动画开始前调用此方法                Toast.makeText(ObjectAnimatorActivity.this, "start", Toast.LENGTH_SHORT).show();            }            @Override            public void onAnimationEnd(Animator animator) {                //动画结束后调用此方法                Toast.makeText(ObjectAnimatorActivity.this, "end", Toast.LENGTH_SHORT).show();            }            @Override            public void onAnimationCancel(Animator animator) {            }            @Override            public void onAnimationRepeat(Animator animator) {            }        });        animator.setDuration(3000);        animator.start();    }

方式2(选择实现方法)

    //为动画添加监听事件方式二(选择实现方法)    private void addAnimatorListener2(View view){        ObjectAnimator animator = ObjectAnimator.ofFloat(view, "Y", 0f, 1000f);        animator.addListener(new AnimatorListenerAdapter() {            @Override            public void onAnimationStart(Animator animation) {                super.onAnimationStart(animation);                //动画开始前调用此方法                Toast.makeText(ObjectAnimatorActivity.this, "start", Toast.LENGTH_SHORT).show();            }            @Override            public void onAnimationEnd(Animator animation) {                super.onAnimationEnd(animation);                //动画结束后调用此方法                Toast.makeText(ObjectAnimatorActivity.this, "end", Toast.LENGTH_SHORT).show();            }        });        animator.setDuration(3000);        animator.start();    }

这里贴一个使用ObjectAnimator实现经典弹球菜单demo的代码

public class MainActivity extends Activity implements View.OnClickListener{    private int[] res = {R.id.imageView_a,R.id.imageView_b,                         R.id.imageView_c, R.id.imageView_d,                         R.id.imageView_e,R.id.imageView_f,                          R.id.imageView_g,R.id.imageView_h};    private List<ImageView> imageViewList = new ArrayList<ImageView>();    private boolean flag = true;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        for (int i = 0;i<res.length;i++){            ImageView imageView = (ImageView) findViewById(res[i]);            imageView.setOnClickListener(this);            imageViewList.add(imageView);        }    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.imageView_a:                if (flag){ //第一次点击展开菜单                    startAnima();                }else{                    closeAnima();                }                break;            default:                Toast.makeText(this, "你点击了"+view.getId(),                Toast.LENGTH_SHORT).show();                break;        }    }    //展开菜单    private void startAnima() {        for (int i = 1;i<res.length;i++){            ObjectAnimator animator = ObjectAnimator.ofFloat(imageViewList.get(i),                    "TranslationY",0f,i*200f);            animator.setDuration(1000);            //添加一个模仿弹球落地的动画效果            animator.setInterpolator(new BounceInterpolator());            //每个延时0.3s依次落下            animator.setStartDelay(i*300);            animator.start();            flag = false;        }    }    //回收菜单    private void closeAnima() {        for (int i = 1;i<res.length;i++){            ObjectAnimator animator =    ObjectAnimator.ofFloat(imageViewList.get(i),                    "TranslationY",i*200f,0f);            animator.setDuration(500);            //添加一个模仿弹球落地的动画效果            animator.setInterpolator(new BounceInterpolator());            //每个延时0.3s依次回收            animator.setStartDelay(i*300);            animator.start();            flag = true;        }    }}

布局

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.sqf.objectanimatorsample.MainActivity">    <ImageView        android:id="@+id/imageView_b"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:paddingLeft="5dp"        android:paddingTop="5dp"        android:src="@drawable/b"/>    <ImageView        android:id="@+id/imageView_c"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:paddingLeft="5dp"        android:paddingTop="5dp"        android:src="@drawable/c"/>    <ImageView        android:id="@+id/imageView_d"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:paddingLeft="5dp"        android:paddingTop="5dp"        android:src="@drawable/d"/>    <ImageView        android:id="@+id/imageView_e"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:paddingLeft="5dp"        android:paddingTop="5dp"        android:src="@drawable/e"/>    <ImageView        android:id="@+id/imageView_f"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:paddingLeft="5dp"        android:paddingTop="5dp"        android:src="@drawable/f"/>    <ImageView        android:id="@+id/imageView_g"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:paddingLeft="5dp"        android:paddingTop="5dp"        android:src="@drawable/g"/>    <ImageView        android:id="@+id/imageView_h"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:paddingLeft="5dp"        android:paddingTop="5dp"        android:src="@drawable/h"/>    <ImageView        android:id="@+id/imageView_a"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/a"/></FrameLayout>