一、动画分类
1. View Animation :
alpha 透明渐变 , Scale 缩放 、translate 位移, rotate 旋转
继承Animation,自己重写一个动画
2. Drawable Animation:
3. Property Animation : ViewAnimator, ObjectAnimator
4. LayoutAnimationController 布局动画
1. View Animation (Tween动画)
执行一系列简单的转换。
针对 视图对象内容进行移动,放大,缩小以及产生透明度的变化等四种动画操作。仅针对视图对象内容:
例如:有一个TextView仅能针对文字进行四种动画操作。
例如:有一个ImageView仅能针对背景进行四种动画操作。
更多可参考文档:
http://developer.android.com/guide/topics/graphics/view-animation.html
2. Drawable Animation (Frame动画)
传统的动画方法,通过顺序的播放排列好的图片来实现。
某种意义上说像一个胶卷,它是创建一系列不同的对象,按顺序播放。基类是AnimationDrawable
不能再onCreate中调用start方法,因为AnimationDrawable尚未完全附加到窗口上。如果你想立即播放动画,而无需互动,那么你可能想在您的活动onWindowFocusChanged()方法,当Android有焦点时调用它。
更多可参考文档
http://developer.android.com/guide/topics/graphics/drawable-animation.html
3.Property Animation
Android 11 (3.0)以上才支持,看很多介绍时可以改变视图的属性,但是支持视图外所有对象的动画变换,但是未发现如何修改视图属性的。
ViewPropertyAnimator
interpolator
二、Property Animation与View Aimation区别?
1. View动画只支持4种属性,单独改变视图的宽高无法实现。
2. View动画仅修改绘制位置等,但是点击事件的位置不会变,导致点击错位。
3. View动画比属性动画代码量少,如果前者可以满足需求,不需要使用属性动画。
4. 属性动画可以直接修改View的属性值。
三、View Animation原理
1. 创建Animation
2. invalidate
3. drawChild、onDraw
4. getTransformation
两种模式:
独占:用主线程画,不能有其他操作
中断:每次都执行invalidate
四、Property Animation原理
View Animation 与 DrawableAnimation仅重新绘制,即使使用位移动画显示位置发生改变,其实视图的位置为发生改变。
分别是位置,大小,角度由Matrix 进行3*3的矩阵变换,、透明度Alpha负责。
代码和xml配置两种
参考资料:
Android中图像变换Matrix的原理、代码验证和应用(一) 共有3篇 分析android动画模块 Android 动画框架详解,第 1 部分 、 Android 动画框架详解,第 2 部分
Property Animation - 实解
Animation Resources
android动画(一)Interpolator
计算公式生成图像
http://www.wolframalpha.com/
关于android的animation的xml定义中的android:interpolator属性的含义
动画完整介绍 Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
分析android动画模块 非常优秀
View Animation 例子:移动动画效果图
三、移动动画源码
private ImageView mImageView;
private TranslateAnimation mTranslateLeft;
private TranslateAnimation mTranslateRight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 供移动ImageView
mImageView = (ImageView) findViewById(R.id.imageview);
// 两个按钮
Button leftButton = (Button) findViewById(R.id.left_button);
leftButton.setOnClickListener(this);
Button rightButton = (Button) findViewById(R.id.right_button);
rightButton.setOnClickListener(this);
// 指定移动位置
mTranslateRight = new TranslateAnimation(0, 100, 0, 100);
// 设置动画时间,单位是毫秒
mTranslateRight.setDuration(1000);
// 添加此开关,之后才有效
mTranslateRight.setFillEnabled(true);
// 指动画结束时画面停留在此动画的第一帧
mTranslateRight.setFillBefore(true);
mTranslateLeft = new TranslateAnimation(100, 0, 100, 0);
mTranslateLeft.setDuration(1000);
mTranslateLeft.setFillEnabled(true);
// 指动画结束时画面停留在此动画的最后一帧
mTranslateLeft.setFillAfter(true);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.left_button:
// 启动方式1
mImageView.setAnimation(mTranslateRight);
mTranslateRight.startNow();
break;
case R.id.right_button:
// 启动方式2
mImageView.startAnimation(mTranslateLeft);
break;
}
}
三、动画框架NineOldAnimation使用总结
1. 不需要判断Andorid API版本,直接使用nine old API
2. AndroidSet.setDuration无效,必须针对每一个Animator设置才有效
3. 关闭动画 - 不能使用View.clearAnimation() ,需要使用Animation.cancel();
4. 动画结束 - end监听中先cancel自己,可能会出现反复执行。动画执行结束后,如果使用监听,记得自己清理自己。AnimationSet 记得使用完后自己清理,并且恢复到初始状态。
5. 被动关闭 - 切换Activity会直接停止,所以停止时记得还原动画还原为初始状态。
6. 动画硬件加速:HTC G12 崩溃 (2.3系统)
2015-10-30 内容修改