android——ObjectAnimator动画

在新的android sdk中谷歌为我们提供了新的动画实现方式。化繁为简。将以前的animation动画进一步封装,使用起来更加方便。

先来看XML文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:layout_height="40dp" >

        <ImageView
            android:id="@+id/rect"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/rect" />
        <ImageView 
            android:id="@+id/star"
            android:layout_width="60dp"
            android:layout_height="match_parent"
            android:background="@drawable/star"
            />
    </LinearLayout>

    <ImageView
        android:id="@+id/b"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_margin="10dp"
        android:background="@drawable/b" />

    <ImageView
        android:id="@+id/c"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_margin="10dp"
        android:background="@drawable/c" />

    <ImageView
        android:id="@+id/d"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_margin="10dp"
        android:background="@drawable/d" />

    <ImageView
        android:id="@+id/e"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_margin="10dp"
        android:background="@drawable/e" />

    <ImageView
        android:id="@+id/a"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_margin="10dp"
        android:background="@drawable/a" />

</RelativeLayout>

然后看看activity文件

package com.example.testanimator;

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

import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.animation.FastOutLinearInInterpolator;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AnticipateInterpolator;
import android.view.animation.BounceInterpolator;
import android.view.animation.CycleInterpolator;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
    private ImageView a, b, c, d, e;
    private int res[] = { R.id.a, R.id.b, R.id.c, R.id.d, R.id.e };
    private List<ImageView> listImg = new ArrayList<ImageView>();
    private boolean isStart = false;
    private float y;
    private float x;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        for (int i = 0; i < res.length; i++) {
            ImageView img = (ImageView) findViewById(res[i]);
            listImg.add(img);
            img.setOnClickListener(this);
        }
        x = listImg.get(0).getPivotX();
        y = listImg.get(0).getPivotY();
    }

    private void startAnimator() {

        isStart = true;
        for (int i = 0; i < listImg.size(); i++) {
            ObjectAnimator.ofFloat(listImg.get(i), "translationY", y, y - 400 + i * 100).setDuration(1000).start();
            ObjectAnimator.ofFloat(listImg.get(i), "translationX", x, x + i * 100).setDuration(1000).start();
        }
    }

    private void closeAnimator() {
        isStart = false;
        for (int i = 0; i < listImg.size(); i++) {
            ObjectAnimator animator = ObjectAnimator.ofFloat(listImg.get(i), "translationY", y - 400 + i * 100, y);

            animator.setDuration(1000);
            animator.setStartDelay(1000);
            animator.setInterpolator(new BounceInterpolator()); //设置插值器
            animator.start();
        }

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float startx ,starty;
        float endx ,endy ;

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:

            break;
        case MotionEvent.ACTION_MOVE:

            break;
        default:
            break;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
        case R.id.a:
            if (isStart) {
                closeAnimator(); //还原位置
            } else {
                startAnimator(); //开始动画移动位置和焦点
            }
            break;

        default:
            break;
        }

    }

}
原文地址:https://www.cnblogs.com/shoneworn/p/9029451.html