android 动画主要分为view 动画、属性动画和帧动画
View 动画
概念
view 动画是对动画对象本身做平移、旋转、缩放以及透明度的改变,只是对view的影像做出改变,其实没有改变view的状态。
使用方式可以通过创建xml文件的方式定义执行的动画,也可以通过代码的方式
引用动画文件
View view = findViewById(R.id.textView);
Animation animation = AnimationUtils.loadAnimation(this, R.anim.animation1);
view.startAnimation(animation);
通过代码的形式应用
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
view.startAnimation(animation);
view动画的四种变换
| 名称 | 标签 | 子类 | 效果 |
|---|---|---|---|
| 平移动画 | <translate> | TranslateAnimation | 移动view |
| 缩放动画 | <scale> | ScaleAnimation | 放大或者缩小View |
| 旋转动画 | <rotate> | RotateAnimation | 旋转View |
| 透明度动画 | <alpha> | AlphaAnimation | 改变view的透明度 |
特殊的应用场景
view动画也可以用于在ViewGroup中控制子元素的出场效果,在Activity的切换效果
LayoutAnimation LayoutAnimation 知道一个anim的文件,把动画效果作用于ViewGroup的子元素
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="normal"
android:animation="@anim/anim_item"/>
delay 表示子元素动画开始的延迟率,延迟时间为前面子元素动画执行周期*延迟率
animationOrder表示子元素动画的顺序,有normal、reverse和random
Activity 的切换效果
在overridePendingTransition(int enterAnim, int exitAnim) 中指定动画资源id,就可以为Activity的进出场设置动画效果了。
属性动画
概念
属性动画是在API 11之后支持,从它的名字可以看出,它是一种对对象的属性做变化而产生的动画效果,常用的类有ValueAnimator、ObjectAnimator和AnimatorSet。只要作用的对象包含有要改变的属性的set和get方法,就可以对这个属性实现动画效果。对于没有set方法和get方法的属性,可以使用一个包装类类实现该接口,间接改变这个属性的值,然后对该类实施动画效果就行。
对Button 宽度实现拉长变窄
class ViewWrapper {
private View targetView;
public ViewWraper(View view) {
targetView = view;
}
public int getWidth() {
return targetView.getLayoutParams().width;
}
public void setWidth(int width) {
targetView.getLayoutParams().width = width;
targetView.requestLayout();
}
}
TimeInterpolator 和 TypeEvaluator
TimeInterpolator 中文为时间插值器,它作用于根据时间流逝的百分比来计算出当前属性的值对应改变的百分比,预置的有LinearInterpolator(匀速变化)、AccelerateDecelerateInterpolator(开头和结尾慢,中间快)和DecelerateInterpolator(减速插值器)。
TypeEvaluator 类型估值算法,根据属性改变的百分比来计算改变后的属性值。预置有IntEvaluator、FloatEvaluator和ArgeEvaluator。
使用动画注意事项
- OOM 使用帧动画的过程中,当图片数量较多且较大时容易出现
- 内存泄露 如果动画设置了无限循环,在Activity 退出的时候没有及时停止,导致Activity 无法释放导致内存泄露
- 动画元素的交互 view动画结束之后view的单击事件停留在了原位置,而不是动画结束时的位置
- 动画过程中用到的单位尽量使用dp而不是px
- view动画只是改变了view的影像,没有改变view的状态。