前言
如果所有事物都是静止的,那得多无聊。动画的引用让无聊的世界增加许多乐趣。
android 动画分类
- android 3.0系统 之前 帧动画(Frame Animation),android 3.0 及android 3.0之后新增的补间动画(Tweened Animation)
- 其他动画 gif动画,svg动画
- 3D 动画
帧动画
逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画,逐帧动画依靠完善的图片资源。
简单实现方式
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/a_0"
android:duration="100" />
<item
android:drawable="@drawable/a_1"
android:duration="100" />
<item
android:drawable="@drawable/a_2"
android:duration="100" />
</animation-list>
出处。
java
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frame_animation);
ImageView animationImg1 = (ImageView) findViewById(R.id.animation1);
animationImg1.setImageResource(R.drawable.frame_anim1);
AnimationDrawable animationDrawable1 = (AnimationDrawable) animationImg1.getDrawable();
animationDrawable1.start();
}
效果图
tips:
逐帧动画每一帧就是完整动画某一时刻的状态,不同的状态通过一个时间轴按顺序进行显示
性能问题引用: Android 中一张图片占用内存大小是如何计算的
补间动画(tweened Animation)
有四种动画:
Alpha(淡入淡出),
translate(位移动画),
scale(缩放动画),
rotate(旋转动画)。
两种实现方式,Xml 实现方式,代码创建方式
例子:
淡入淡出
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromAlpha="1.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toAlpha="0.0" />
缩放
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0"/>
混合fixed 方式
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>
在Activity 中使用
Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.alpha_anim);
img = (ImageView) findViewById(R.id.img);
img.startAnimation(animation);
tip: Interpolator 动画差值器和 pivot 这两个属性, Interpolator 主要作用是可以控制动画的变化速率 ,就是动画进行的快慢节奏。pivot 决定了当前动画执行的参考位置。
这里贴出来java实现动画的方式
private void RotateAnimation() {
animation = new RotateAnimation(-deValue, deValue, Animation.RELATIVE_TO_SELF,
pxValue, Animation.RELATIVE_TO_SELF, pyValue);
animation.setDuration(timeValue);
if (keep.isChecked()) {
animation.setFillAfter(true);
} else {
animation.setFillAfter(false);
}
if (loop.isChecked()) {
animation.setRepeatCount(-1);
} else {
animation.setRepeatCount(0);
}
if (reverse.isChecked()) {
animation.setRepeatMode(Animation.REVERSE);
} else {
animation.setRepeatMode(Animation.RESTART);
}
img.startAnimation(animation);
}
总结:
android 帧动画和补间动画可以完成一些简单的动画需求,对于更加复杂的动画需要对属性进行精确控制的动画需求,建议使用属性动画,也就是接下来所介绍的
缺点:
逐帧动画 & 补间动画存在一定的缺点:
a. 作用对象局限:View
即补间动画 只能够作用在视图View上,即只可以对一个Button、TextView、甚至是LinearLayout、或者其它继承自View的组件进行动画操作,但无法对非View的对象进行动画操作
有些情况下的动画效果只是视图的某个属性 & 对象而不是整个视图;
如,现需要实现视图的颜色动态变化,那么就需要操作视图的颜色属性从而实现动画效果,而不是针对整个视图进行动画操作
b. 没有改变View的属性,只是改变视觉效果
补间动画只是改变了View的视觉效果,而不会真正去改变View的属性。
如,将屏幕左上角的按钮 通过补间动画 移动到屏幕的右下角
点击当前按钮位置(屏幕右下角)是没有效果的,因为实际上按钮还是停留在屏幕左上角,补间动画只是将这个按钮绘制到屏幕右下角,改变了视觉效果而已。
c. 动画效果单一
补间动画只能实现平移、旋转、缩放 & 透明度这些简单的动画需求
一旦遇到相对复杂的动画效果,即超出了上述4种动画效果,那么补间动画则无法实现。
即在功能 & 可扩展性有较大局限性
未完
属性动画
字面意思就是针对对象属性的动画。
工作原理
在一定时间间隔内,通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果
总结:
传统动画(逐帧动画,alpha,translate,rotate,scale)与ObjectAnimator之间各有优缺点,translate动画并不是真正的对view的位置进行位移,而是仅仅绘制一个影子在动画结束的位置。传统动画只可以对View进行动画操作。对于更细节控制,传统动画无法实现,而属性动画可以对对象的某个属性进行操作。动画操作之后,view的位置会改变到动画结束位置。
使用objectAnimator 在Activity离开或者关闭时候需要主动cancel动画,防止内存泄露。
xml文件实现的动画复用率高。当使用逐帧动画要避免使用过大的图片,容易导致内存不足。
引用> https://blog.csdn.net/guolin_blog/article/details/44171115