先回顾动画的创建方式
动画 | 创建方式 | 获取Animation对象的方式 | 例子 |
---|---|---|---|
帧动画drawable animation | 代码创建 | getBackground() | AnimationDrawable animation = (AnimationDrawable) imageView.getBackground(); |
– | xml | 不需要获取 | android:background=”@drawable/animation_main” |
补间动画View Animation | 代码创建 | new … | RotateAnimation animation = new RotateAnimation(1, 10); |
– | xml创建 | AnimationUtils.loadAnimation(…) | Animation animation = AnimationUtils.loadAnimation(context, R.anim.anim_translate) |
属性动画Property Animator | 代码创建 | ObjectAnimator.ofFloat(…) | ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, “scaleX”, 1, 3, 1, 3,5, -2) |
– | xml创建 | AnimatorInflater.loadAnimator(…) | ObjectAnimator oa = (ObjectAnimator) AnimatorInflater.loadAnimator(context, R.animator.alpha) |
简介
属性动画ObjectAnimator是一种值动画,ObjectAnimator继承自Animator,而不是Animation,所以吧不能采用view.startAnimation(objectAnimator)
创建方式
属性动画的执行类是ObjectAnimator
,是通过静态方法获取的。
ofFloat(Object target, String propertyName, float... values)
ofInt(Object target, String propertyName, int... values)
动画 | 创建方式 | 获取Animation对象的方式 | 例子 |
---|---|---|---|
属性动画Property Animator | 代码创建 | ObjectAnimator.ofFloat(…) | ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, “scaleX”, 1, 3, 1, 3,5, -2) |
– | xml创建 | AnimatorInflater.loadAnimator(…) | ObjectAnimator oa = (ObjectAnimator) AnimatorInflater.loadAnimator(context, R.animator.alpha) |
效果图
代码方式创建属性动画
propertyName:ranslationX
scaleX
Alpha
rotation
都有对应的代码设置方式
iv.setTranslationX(80);
iv.setScaleX(2);
iv.setAlpha(0.5f);
iv.setRotationX(180);
也有xml
android:translationX="100"
android:scaleX="2"
android:alpha="0.5"
android:rotationX="180"
Translation
ranslationX: 沿X轴移动
ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "TranslationX", 0, 50,20, 0, 90);
oa1.setDuration(1000);
oa1.start();
scale
scaleX:X轴(宽度)缩放,Y轴(高度)不变 -2表示先缩放到0(消失),然后到2倍大小
ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "scaleX", 1, 3, 1, 3,5, -2);
oa1.setDuration(5000);
oa1.start();
Alpha
透明度变化
ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "Alpha", 1.0f, 0.5f, 0,1.0f);
oa1.setDuration(5000);
oa1.start();
rotation
rotationX:X轴旋转
ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "rotationX", 100, 200,300, 300, 0);
oa1.setDuration(1000);
oa1.start();
效果图
2种创建方式
Interpolator
有2种创建方式,一种用xml
创建,一种用java创建。
OvershootInterpolator overshoot = new OvershootInterpolator(1.0f);
OvershootInterpolator interpolator = (OvershootInterpolator) AnimationUtils.loadInterpolator(MainActivity.this, android.R.interpolator.overshoot);
不强制转化,用Interpolator也可以
Interpolator interpolator =AnimationUtils.loadInterpolator(MainActivity.this, android.R.interpolator.overshoot);
注意:Interpolator
是包android.view.animation
下
import android.view.animation.Interpolator;
xml创建
private boolean flag = true;
Interpolator interpolator = AnimationUtils.loadInterpolator(MainActivity.this, android.R.interpolator.bounce);
Path path1 = new Path();
path1.moveTo(1.0f, 1.0f);
path1.lineTo(0.2f, 0.2f);
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, View.SCALE_X, View.SCALE_Y, path);
objectAnimator.setDuration(2000);
objectAnimator.setInterpolator(interpolator);
objectAnimator.start();
TranslationX
、scaleX
都是常量
常量 | 值 |
---|---|
View.TRANSLATION_X | translationX |
View.TRANSLATION_Y | translationY |
View.TRANSLATION_Z | |
View.SCALE_X | translationZ |
View.SCALE_Y | scaleX |
View.ALPHA | scaleY |
View.ROTATION | alpha |
View.ROTATION_X | rotationX |
View.ROTATION_Y | rotationY |
动画合集
AnimatorSet set = new AnimatorSet();
ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "scaleX", 1, 3, 1, 3,5, -2);
ObjectAnimator oa2 = ObjectAnimator.ofFloat(iv, "scaleX", 1, 3, 1, 3,5, -2);
ObjectAnimator oa3 = ObjectAnimator.ofFloat(iv, "Alpha", 1.0f, 0.5f, 0,1.0f);
ObjectAnimator oa4 = ObjectAnimator.ofFloat(iv, "rotationX", 100, 200,300, 300, 0);
set.setTarget(iv);
set.setDuration(1000);
// set.playSequentially(oa1,oa2,oa3,oa4);//一次执行动画
set.playTogether(oa1, oa2, oa3, oa4);// 一起执行动画
set.start();
xml方式创建属性动画
先创建xml,才可以开启动画。
注意:需要在res目录下创建animator
文件夹,而不是anim
。
scale
是propertyName
,不能是propertyXName
<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android" >
<objectAnimator
android:duration="1500"
android:propertyName="translationX"
android:valueFrom="10"
android:valueTo="80" >
</objectAnimator>
</animator>
scale
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:propertyName="scaleX"
android:valueFrom="1"
android:valueTo="0.2" >
</objectAnimator>
Alpha
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:propertyName="alpha"
android:valueFrom="0.1"
android:valueTo="1">
</objectAnimator>
rotation
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:propertyName="rotationX"
android:valueFrom="0"
android:valueTo="360">
</objectAnimator>
开启属性动画
ObjectAnimator oa = (ObjectAnimator) AnimatorInflater.loadAnimator(context, R.animator.scale);
oa.setTarget(iv);
oa.start();
开启属性动画集合
xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<objectAnimator
android:duration="1500"
android:propertyName="translationX"
android:valueFrom="10"
android:valueTo="80" />
<objectAnimator
android:duration="2000"
android:propertyName="scaleX"
android:valueFrom="1"
android:valueTo="0.2" />
<objectAnimator
android:duration="2000"
android:propertyName="rotationX"
android:valueFrom="0"
android:valueTo="360" />
<objectAnimator
android:duration="2000"
android:propertyName="scaleX"
android:valueFrom="0.5"
android:valueTo="1" />
</set>
开启属性动画集合
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(context, R.animator.set);
set.setTarget(iv);
set.start();
补间动画和属性动画的区别?
补间动画不会改变view的坐标,
属性动画会改变view的坐标。