Property动画示例

1、概述
Android提供了几种动画类型:View Animation 、Drawable Animation 、Property Animation 。
View Animation比较简单,支持简单的缩放、平移、旋转、透明度基本的动画,有一定的局限性。比如:你希望View有一个颜色的切换动画;你希望可以使用3D旋转动画;你希望当动画停止时,View的位置就是当前的位置;这些View Animation都无法做到。这就是Property Animation产生的原因。

Drawable Animation叫帧动画,多个图片连续播放,类型gif,用法比较简单。

Property Animation叫做属性动画,故名思议就是通过改变对象的属性的方式实现动画效果,Property功能比另外两种都要强大,目前学会这一种动画,基本就够用了。属性动画本质上就是,动画的执行类来设置动画操作的对象的属性、持续时间,开始和结束的属性值,时间差值等,然后系统会根据设置的参数动态的变化对象的属性。下面就property属性动画举个栗子:

重点掌握两个核心类:
ObjectAnimator 动画的执行类(详见例子)
ValueAnimator 动画的执行类(相对复杂)

MainActivity中的代码:

/**
 * 属性动画(主要通过改变控制点的值,实现动画)
 */
public class MainActivity extends AppCompatActivity {
    private ImageView img;
    private ObjectAnimator objectAnimator1;
    private ObjectAnimator objectAnimator2;
    private ObjectAnimator objectAnimator3;

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

    private void init() {
        img = (ImageView) findViewById(R.id.img);
        //下面的三个初始化,为了属性动画集合animatorSet()方法准备。
        objectAnimator1 = ObjectAnimator.ofFloat(img, "alpha",
                new float[]{0.0f, 0.9f, 0.3f, 1.0f});

        objectAnimator2 = ObjectAnimator.ofFloat(img, "rotation",
                new float[]{0f, 90f, 45f, 180f, 360f, 45f});
        objectAnimator2.setDuration(2000);

        objectAnimator3 = ObjectAnimator.ofFloat(img, "translationY",
                new float[]{0f, 180f, 360f});
    }

    //点击事件
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.bt_alpha:
                alphaProperty();
                break;
            case R.id.bt_rotate:
                rotateProperty();
                break;
            case R.id.bt_set:
                animatorSet();
                break;
            default:
                break;
        }
    }

    /**
     * 1.创建一个ObjectAnimator对象
     * 2.设置动画点基本属性
     * 3.调用动画的开启方法
     */
    //透明度动画
    private void alphaProperty() {
        ObjectAnimator objectAnimatorAlpha = ObjectAnimator.ofFloat(img,//动画设置的控件
                "alpha",//view中有的属性方法,此处是设置的透明度,
                // 该字符串一定要查询API中存在的属性(最好拷贝过来),
                // 后面的数组是改变该属性的数值,有的属性用的是float,有的是int,具体查询api
                new float[]{0.0f, 0.9f, 0.3f, 1.0f}//可变参数,对于属性值的改变
        );
        //设置动画持续时间
        objectAnimatorAlpha.setDuration(2000);
        //设置动画重复次数
        objectAnimatorAlpha.setRepeatCount(1);
        //设置动画重复类型,从头开始,原路返回等。
        objectAnimatorAlpha.setRepeatMode(Animation.RESTART);
        //动画启动
        objectAnimatorAlpha.start();
    }

    //旋转动画
    private void rotateProperty() {
        ObjectAnimator objectAnimatorRotate = ObjectAnimator.ofFloat(img, "rotation",
                new float[]{0f, 45f, 135f, 90f, 45f, 180f});
        objectAnimatorRotate.setDuration(2000);
        objectAnimatorRotate.setRepeatCount(0);
        objectAnimatorRotate.setRepeatMode(Animation.REVERSE);
        objectAnimatorRotate.start();
    }

    //创建一个属性动画集合
    //AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等
    private void animatorSet() {
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.play(objectAnimator1).with(objectAnimator2).with(objectAnimator3);
        animatorSet.setTarget(img);
        animatorSet.start();
    }
}

布局文件中的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical"
    tools:context="com.myapplication.property.MainActivity"
    >

    <Button
        android:id="@+id/bt_alpha"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="属性动画透明度"
        />

    <Button
        android:id="@+id/bt_rotate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="属性动画旋转"
        />

    <Button
        android:id="@+id/bt_set"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="属性动画集合"
        />

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/rose"
        />
</LinearLayout>

界面展示如下
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值