Android动画·Property之ObjectAnimato
2017-11-20 本文已影响3人
Android师哥
night_rain.png
属性动画是一种不断地对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性。所以我们仍然可以将一个View进行移动或者缩放,但同时也可以对自定义View中的Point对象进行动画操作了。我们只需要告诉系统动画的运行时长,需要执行哪种类型的动画,以及动画的初始值和结束值,剩下的工作就可以全部交给系统去完成了
ObjectAnimator
动画效果.gif它继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。那么既然是继承关系,说明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它们的用法也非常类似,接下来看看效果:
- 布局文件
<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>
- Activity
RadioButton选择
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();
}