Android之旅

Android动画·Property之ObjectAnimato

2017-11-20  本文已影响3人  Android师哥
night_rain.png

属性动画是一种不断地对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性。所以我们仍然可以将一个View进行移动或者缩放,但同时也可以对自定义View中的Point对象进行动画操作了。我们只需要告诉系统动画的运行时长,需要执行哪种类型的动画,以及动画的初始值和结束值,剩下的工作就可以全部交给系统去完成了

ObjectAnimator

它继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。那么既然是继承关系,说明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它们的用法也非常类似,接下来看看效果:

动画效果.gif
<LinearLayout 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"
    android:background="#f2f2f2"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.nightrain.qfamily.animation_test_objectanimator.MainActivity">

    <Button
        android:id="@+id/btn_main_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:paddingBottom="10dp"
        android:paddingTop="10dp"
        android:text="开启动画"
        android:textSize="17sp" />

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

        <RadioGroup
            android:id="@+id/rg_main"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <RadioButton
                android:id="@+id/rb_main_1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="透明"
                android:textColorHint="#000" />

            <RadioButton
                android:id="@+id/rb_main_2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="X轴平移"
                android:textColorHint="#000" />

            <RadioButton
                android:id="@+id/rb_main_3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="Y轴平移"
                android:textColorHint="#000" />

            <RadioButton
                android:id="@+id/rb_main_4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="X轴缩放"
                android:textColorHint="#000" />

            <RadioButton
                android:id="@+id/rb_main_5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="Y轴缩放"
                android:textColorHint="#000" />

            <RadioButton
                android:id="@+id/rb_main_6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="X轴旋转"
                android:textColorHint="#000" />

            <RadioButton
                android:id="@+id/rb_main_7"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="Y轴旋转"
                android:textColorHint="#000" />

            <RadioButton
                android:id="@+id/rb_main_8"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="Z轴旋转"
                android:textColorHint="#000" />

            <RadioButton
                android:id="@+id/rb_main_9"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="字体闪烁"
                android:textColorHint="#000" />
        </RadioGroup>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/iv_main"
                android:layout_width="200dp"
                android:layout_height="200dp"
                android:src="@mipmap/icon_3" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>
rgMain.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                if (i == rbMain1.getId()) {
                    animType = TYPE_ALPHA;
                } else if (i == rbMain2.getId()) {
                    animType = TYPE_TRANSLATION_X;
                } else if (i == rbMain3.getId()) {
                    animType = TYPE_TRANSLATION_Y;
                } else if (i == rbMain4.getId()) {
                    animType = TYPE_SCALE_X;
                } else if (i == rbMain5.getId()) {
                    animType = TYPE_SCALE_Y;
                } else if (i == rbMain6.getId()) {
                    animType = TYPE_ROTATION_X;
                } else if (i == rbMain7.getId()) {
                    animType = TYPE_ROTATION_Y;
                } else if (i == rbMain8.getId()) {
                    animType = TYPE_ROTATION_Z;
                } else if (i == rbMain9.getId()) {
                    animType = TYPE_TWINKLE;
                }
            }
        });

各种动画效果

public void onClick() {
        ObjectAnimator mObjectAnimator = null;
        switch (animType) {
            case TYPE_ALPHA:
                mObjectAnimator = ObjectAnimator.ofFloat(ivMain, "alpha", 1, 0, 1);
                break;
            case TYPE_TRANSLATION_X:
                mObjectAnimator = ObjectAnimator.ofFloat(ivMain, "translationX", 0, 200, 0);
                break;
            case TYPE_TRANSLATION_Y:
                mObjectAnimator = ObjectAnimator.ofFloat(ivMain, "translationY", 0, 200, 0);
                break;
            case TYPE_SCALE_X:
                mObjectAnimator = ObjectAnimator.ofFloat(ivMain, "scaleX", 1, 0, 1);
                break;
            case TYPE_SCALE_Y:
                mObjectAnimator = ObjectAnimator.ofFloat(ivMain, "scaleY", 1, 0, 1);
                break;
            case TYPE_ROTATION_X:
                mObjectAnimator = ObjectAnimator.ofFloat(ivMain, "rotationX", 1, 360);
                break;
            case TYPE_ROTATION_Y:
                mObjectAnimator = ObjectAnimator.ofFloat(ivMain, "rotationY", 1, 360);
                break;
            case TYPE_ROTATION_Z:
                mObjectAnimator = ObjectAnimator.ofFloat(ivMain, "rotation", 1, 360);
                break;
            case TYPE_TWINKLE:
                mObjectAnimator = ObjectAnimator.ofInt(btnMain1, "textColor", Color.parseColor("#FFB90F"), Color.parseColor("#FFFF00"));
                //重复次数
                mObjectAnimator.setRepeatCount(Animation.INFINITE);
                //重复的模式 REVERSE:返向 RESTART:返回
                mObjectAnimator.setRepeatMode(ValueAnimator.REVERSE);
                break;
        }
        mObjectAnimator.setDuration(3000);
        mObjectAnimator.start();
    }
上一篇下一篇

猜你喜欢

热点阅读