1 Android动画有哪些
Android 平台提供了一套完整的动画框架。
在Android3.0之前有两种动画,一种方式是补间动画 Tween Animation、另一种叫逐帧动画 Frame Animation(也称Drawable Animation )。
Tween Animation、Frame Animation只能用于View,被归类为View Animation。
Android3.0以后增加了属性动画Property Animation。这样子动画就分成两部分:
Google Android Docs - Animation
2 View Animation
2.1 Tween Animation
TweenAnimation只能应用于View对象,而且只支持一部分属性,如支持缩放旋转而不支持背景颜色的改变。而且对于TweenAnimation,并不改变属性的值,它只是改变了View对象绘制的位置,而没有改变View对象本身,比如,你有一个Button,坐标(100,100),Width:100,Height:100,而你有一个动画使其移动(200,200),你会发现动画过程中触发按钮点击的区域仍是(100,100)-(200,200)。
2.1.1 定义Tween Animation
View Animation就是一系列View形状的变换,如大小的缩放,透明度的改变,位置的改变,动画的定义既可以用代码定义也可以用XML定义,当然,建议用XML定义。在XML定义的资源,在Android Studio可以用Instant Run快速调试。
可以给一个View同时设置多个动画,比如从透明至不透明的淡入效果,与从小到大的放大效果,这些动画可以同时进行,也可以在一个完成之后开始另一个。
用XML定义的动画放在/res/anim/文件夹内,XML文件的根元素可以为alpha, scale, translate, rotate, interpolator元素或set(表示以上几个动画的集合,set可以嵌套)。
默认情况下,所有动画是同时进行的,可以通过startOffset属性设置各个动画的开始偏移(开始时间)来达到动画顺序播放的效果。
Tween Animation XML示例
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="1.0"
android:toXScale="2"
android:fromYScale="1.0"
android:toYScale="2"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"
/>
<translate
android:duration="2000"
android:fromXDelta="0.0%p"
android:fromYDelta="0.0%p"
android:toXDelta="50.0%p"
android:toYDelta="50.0%p"
/>
<alpha
android:fromAlpha="0.5"
android:toAlpha="1.0"
android:startOffset="500"
android:duration="2000"
/>
<rotate
android:fromDegrees="0"
android:toDegrees="720"
android:pivotX="25"
android:pivotY="25"
android:duration="2000"
/>
</set>
注意:
android:pivotX
和android:pivotY
和android:fromXDelta
,android:toXDelta
android:pivotX="50"
使用绝对坐标
android:pivotX="50%"
相对自己,自己的坐标也是固定的,不会随着位移动画变化。因为Tween动画的View在原处,动画效果是例外生成的图像。
android:pivotX="50%p"
相对父控件
2.1.2 运行Tween动画
ivTween = (ImageView) getView().findViewById(R.id.iv_bat_man);
final Animation animation = AnimationUtils.loadAnimation(mActivity,R.anim.test_animation_tween);
ivTween.startAnimation(animation);
2.1.3 TimeInterplator(时间插值器)
Time interplator定义了属性值变化的方式,如线性均匀改变,开始慢然后逐渐快等。在Property Animation中是TimeInterplator,在View Animation中是Interplator,这两个是一样的,在3.0之前只有Interplator,3.0之后实现代码转移至了TimeInterplator。Interplator继承自TimeInterplator,内部没有任何其他代码。
插值器 | 描述 |
---|---|
AccelerateInterpolator | 加速,开始时慢中间加速 |
DecelerateInterpolator | 减速,开始时快然后减速 |
AccelerateDecelerateInterolator | 先加速后减速,开始结束时慢,中间加速 |
AnticipateInterpolator | 反向 ,先向相反方向改变一段再加速播放 |
AnticipateOvershootInterpolator | 反向加回弹,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值 |
BounceInterpolator | 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100 |
CycleIinterpolator | 循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input) |
LinearInterpolator | 线性,线性均匀改变 |
OvershottInterpolator | 回弹,最后超出目的值然后缓慢改变到目的值 |
TimeInterpolator | 一个接口,允许你自定义interpolator,以上几个都是实现了这个接口 |
2.2 Frame Animation
Drawable Animation(Frame Animation):帧动画,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果。
Java类AnimationDrawable继承于DrawableContainer,DrawableContainer继承于Drawable。
2.2.1 Frame Animation的XML定义
在XML中的定义方式如下:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/loading01" android:duration="200" />
<item android:drawable="@drawable/loading02" android:duration="200" />
<item android:drawable="@drawable/loading03" android:duration="200" />
</animation-list>
必须以animation-list为根元素,以item表示要轮换显示的图片,duration属性表示各项显示的时间。XML文件要放在/res/drawable/目录下。示例:
2.2.2 调用示例
ivDrawable = (ImageView) getView().findViewById(R.id.iv_anim_drawable);
ivDrawable.setBackgroundResource(R.drawable.test_animation_drawable);
AnimationDrawable animationDrawable = (AnimationDrawable) ivDrawable.getBackground();
animationDrawable.start();
3 Property Animation(属性动画)
属性动画,这个是在Android 3.0中才引进的。
Property Animation可以定义在xml文件中,它用来在设定的时间内修改对象的属性。例如背景颜色和alpha的值。它更改的是对象的实际属性。
在View Animation(Tween Animation)中,其改变的是View的绘制效果,真正的View的属性保持不变,比如无论你在对话中如何缩放Button的大小,Button的有效点击区域还是没有应用动画时的区域,其位置与大小都不变。
而在Property Animation中,改变的是对象的实际属性,如Button的缩放,Button的位置与大小属性值都改变了。而且Property Animation不止可以应用于View,还可以应用于任何对象。Property Animation只是表示一个值在一段时间内的改变,当值改变时要做什么事情完全是你自己决定的。
3.1 Property Animation 动画的设置
The property animation system允许开发者定义动画设置:
-
Duration: 动画间隔,默认300ms
-
Time interpolation: 插值器
默认线性插值器
3.1-1 线性匀速动画 - Example of a linear animation
非线性插值器(中间快前后慢)
3.1-2 非线性动画 -
Repeat count and behavior: 重复次数,反向or正向重复
-
Animator sets: 动画集,可以一起播放动画,或者分开播放,或者延迟播放。
-
Frame refresh delay: Frame刷新时间,默认10ms,但是实际刷新时间是由系统资源决定。
3.2 属性动画的实现
How animations are calculatedValueAnimator
ValueAnimator
对象跟踪动画时间,例如,动画已经运行多久,当前属性值是多少;
封装一个TimeInterpolator
插值器;
TypeEvaluator
定义当前的属性如何计算。
例如,图3.1-2的动画,theTimeInterpolatorused would be AccelerateDecelerateInterpolatorand theTypeEvaluator would beIntEvaluator.
3.3 属性动画示例
插值器的实现
// Initialize Interpolators programmatically by loading them from their XML definitions
// provided by the framework.
mInterpolators = new Interpolator[]{
new AnimationUtils().loadInterpolator(getActivity(),
android.R.interpolator.linear),
new AnimationUtils().loadInterpolator(getActivity(),
android.R.interpolator.fast_out_linear_in),
new AnimationUtils().loadInterpolator(getActivity(),
android.R.interpolator.fast_out_slow_in),
new AnimationUtils().loadInterpolator(getActivity(),
android.R.interpolator.linear_out_slow_in)
};
动画的实现:这个ObjectAnimator
对象,使用path来指定x和y的大小变化前后值。
// This ObjectAnimator uses the path to change the x and y scale of the mView object.
ObjectAnimator animator = ObjectAnimator.ofFloat(mView, View.SCALE_X, View.SCALE_Y, path);
// Set the duration and interpolator for this animation
animator.setDuration(duration);
animator.setInterpolator(interpolator);
animator.start();
code via Google Samples - Interpolator。
3.4 Property Animation与View Animation的区别
View Animation的优点,实现起来比较简单,只需要在XML定义并加载。但是全面性和灵活性比较低。
View Animation的不足
- 只能针对View Objects做动画
- 并且变化的方面比较少:例如,背景颜色等就无法实现。
- View Animation的动画是画出来的,而不是View Object真正在移动。所以如果要真正移动View的话,在动画结束之后,自定写View Object的位移逻辑。
Property Animation可以消除以上局限。
3.5 API Overview
你可以从android.animation
找到Property Animation的大多数API。因为View Animation体系已经构建了大量的interpolator插值器在android.view.animation,你也可以在Property Animation中使用。
Animator
类提供了基本的创建动画的方法。你可以通过其子类实现自己需要的动画:
- 提供计时器,动画值的计算
- 动画是否重复播放
- 动画的回调
- the ability to set custom types to evaluate
- 完整的属性动画包括:计算动画值,设置动画值给对象。使用ValueAnimator不会做第二部分操作。需要用户通过回调写赋值的逻辑。
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();
需要在回调中绑定Animator.AnimatorListenerr设置Object的属性。
ObjectAnimator
是ValueAnimator
的子类。
- 不需要用户在回调中写给Object赋值的逻辑。
ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);//绑定Object与其属性
anim.setDuration(1000);
anim.start();
AnimatorSet
设置动画组合。
例如,APIDemos - Bouncing Balls (该DEMO已不在Google Samples里),实现一系列动画:
- Plays bounceAnim.
- Plays squashAnim1, squashAnim2, stretchAnim1, and stretchAnim2 at the same time.
- Plays bounceBackAnim.
- Plays fadeAnim.
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(bounceAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);
bouncer.play(bounceBackAnim).after(stretchAnim2);
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
animatorSet.start();
4 动画矢量图片
矢量图片让您可以用在 XML 中定义的一个矢量图形替换多个 png 资源。在以前的版本中,矢量图片仅限于 Lollipop 和更高版本的设备,现在VectorDrawable和AnimatedVectorDrawable可分别通过两个新的支持内容库support-vector-drawable和animated-vector-drawable获取。
Android Support Library 23.2开始支持支持矢量图片和动画矢量图片。后续好好研究一下。
参考
android 动画分类 - 张兴业的博客 - 博客频道 - CSDN.NET
Android Animation - stormzhang
Android动画之XML(二) - 卡尔 - 博客频道 - CSDN.NET
Google Android Developer Doc Property Animation 更多关于API Overview,ValueAnimator与ObjectAnimator的使用,可以参考。
网友评论