本节和《Android群英传》中的第七章Android动画机制与使用技巧有关系,建议先阅读该章的总结

第7章 Android动画深入分析

7.1 View动画

(1)android动画分为view动画、帧动画和属性动画,属性动画是API 11(Android 3.0)的新特性,帧动画一般也认为是view动画。
(2)AnimationSet的属性android:shareInterpolator表示集合中的动画是否共享同一个插值器,如果集合不指定插值器,那么子动画需要单独指定所需的插值器或者使用默认值。
(3)自定义动画需要继承Animation抽象类,并重新它的initializeapplyTransformation方法,在initialize方法中做一些初始化工作,在applyTransformation方法中进行相应的矩阵变换,很多时候需要采用Camera类来简化矩阵变换的过程。
(4)帧动画使用比较简单,但是容易引起OOM,所以在使用的时候应尽量避免使用过多尺寸较大的图片。

7.2 view动画的特殊使用场景

(1)布局动画(LayoutAnimation)属性分析

<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="reverse"
android:animation="@anim/anim_item"/>

android:delay:表示子元素开始动画的时间延迟,比如子元素入场动画的时间周期是300ms,那么0.5表示每个子元素都需要延迟150ms才能播放入场动画。

给ViewGroup指定LayoutAnimation的两种方式

//xml
android:layoutAnimation="xxx"
//java
Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_item);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
listView.setLayoutAnimation(controller);

(2)Activity切换效果
在startActivity方法后或者finish方法之后调用overridePendingTransition(int inAnim, int outAnim)方法设置进入或者退出的动画效果。
还有其他方式可以给Activity添加切换动画效果,但是往往有兼容性限制,参见《Android群英传》第七章Android动画机制与使用技巧

7.3 属性动画

(1)属性动画可以对任意对象的属性进行动画而不仅仅是view,动画默认的时间间隔是300ms,默认帧率是10ms/帧
(2)属性动画几乎是无所不能,但是它是从API 11才有的,所以存在兼容性问题,可以考虑使用开源动画库nineoldandroids。它的功能和系统原生的android.animations.*中的类的功能完全一致,使用方法也是完全一样,只要我们用nineoldandroids编写动画,那么就能运行在所有的android系统上。
(3)属性android:repeatMode表示动画的重复模式,repeat表示连续重复播放,reverse表示逆向重复播放,也就是第一次播放完后第二次倒着播放动画,第三次还是重头开始播放动画,第四次再倒着播放,以此类推。
(4)插值器和估值器:属性动画实现非匀速动画的重要手段
时间插值器(TimeInterpolator)的作用是根据时间流逝的百分比计算出当前属性值改变的百分比,系统内置的插值器有线性插值器(LinearInterpolator)、加速减速插值器(AccelerateDecelerateInterpolator)和减速插值器(DecelerateInterpolator)。
类型估值器(TypeEvaluator)的作用是根据当前属性改变的百分比计算出改变后的属性值,系统内置的估值器有IntEvaluatorFloatEvaluatorArgbEvaluator
(5)动画监听器
AnimatorListener:监听动画的开始、结束、取消以及重复播放;
AnimatorUpdateListener:监听动画的整个过程,动画每播放一帧的时候onAnimationUpdate方法就会被回调一次。
(6)对任意属性做动画的方法:封装原始对象或者ValueAnimator
(7)属性动画的工作原理:属性动画需要运行在有Looper的线程中,反射调用get/set方法

7.4 使用动画的注意事项

(1)OOM:尽量避免使用帧动画,使用的话应尽量避免使用过多尺寸较大的图片;
(2)内存泄露:属性动画中的无限循环动画需要在Activity退出的时候及时停止,否则将导致Activity无法释放而造成内存泄露。view动画不存在这个问题;
(3)兼容性问题:某些动画在3.0以下系统上有兼容性问题;
(4)view动画的问题:view动画是对view的影像做动画,并不是真正的改变view的状态,因此有时候动画完成之后view无法隐藏,即setVisibility(View.GONE)失效了,此时需要调用view.clearAnimation()清除view动画才行。
(5)不要使用px;
(6)动画元素的交互:在android3.0以前的系统上,view动画和属性动画,新位置均无法触发点击事件,同时,老位置仍然可以触发单击事件。从3.0开始,属性动画的单击事件触发位置为移动后的位置,view动画仍然在原位置;
(7)硬件加速:使用动画的过程中,建议开启硬件加速,这样会提高动画的流畅性。

其他学习资料
1.Android样式的开发:View Animation篇
2.Android样式的开发:Property Animation篇

OK,本章结束,谢谢阅读。

《Android开发艺术探索》读书笔记 (7) 第7章 Android动画深入分析的更多相关文章

  1. Android开发艺术探索读书笔记——01 Activity的生命周期

    http://www.cnblogs.com/csonezp/p/5121142.html 新买了一本书,<Android开发艺术探索>.这本书算是一本进阶书籍,适合有一定安卓开发基础,做 ...

  2. Android开发艺术探索读书笔记——进程间通信

    1. 多进程使用场景 1) 应用某些模块由于特殊需求须要执行在单独进程中. 如消息推送,使消息推送进程与应用进程能单独存活,消息推送进程不会由于应用程序进程crash而受影响. 2) 为加大一个应用可 ...

  3. android开发艺术探索读书笔记之-------view的事件分发机制

    View的点击事件的分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生后,系统需要把这个事件传递给一个具体的View,而这个过程就是分发过程. 分发过程主要由以下 ...

  4. Android开发艺术探索学习笔记(十一)

    第十一章  Android的线程和线程池 从用途上来说,线程分为子线程和主线程,主线程主要处理和界面相关的事情,而子线程往往用于执行耗时的操作.AsyncTask,IntentService,Hand ...

  5. Android开发艺术探索学习笔记(六)

    第六章 Android的Drawable  Drawable的优点:使用简单,比自定义view的成本要低:非图片类型的Drawable占用空间小,有利于减小APK安装包的大小. 6.1Drawable ...

  6. Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧

    第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DP ...

  7. Android开发艺术探索学习笔记(三)

    第三章  View的事件体系 3.1 View基础知识 3.1.1 什么是view View 是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件. 3.1.2 View的 ...

  8. Android开发艺术探索学习笔记(十)

    第十章  Android的消息机制 面试中经常会被问到的一个问题:handler是如何在子线程和主线程中进行消息的传递的,这个问题通过了解Android的消息机制可以得到一个准确的答案. Androi ...

  9. Android开发艺术探索学习笔记(四)

    第四章 View的工作原理 4.1初识ViewRoot和DecorView ViewRoot是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成 ...

  10. Android开发艺术探索学习笔记(一)

    第一章 Activity的生命周期和启动模式 1.1Activity的生命周期全面解析 1.1.1典型情况下的生命周期分析 (1)在两个Activity进行切换时,当前的Activity的onPaus ...

随机推荐

  1. 关于js中alert弹出窗口换行!

    请用"\n" 如果这个不可以的话就是"\\n"   比如: <script type="text/javascript"> al ...

  2. discuz二次开发技巧

    discuz二次开发技巧 二次开发大多时候知识设置和处理,如果能够获知模板文件获得的变量数组将大大提高我们的开发效率 获取页面已经定义的变量 <--{eval printf_r(get_defi ...

  3. PHP面向对象(OOP):把对象串行化serialize()方法,__sleep()方法,__wakeup()方法

    有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,再还原为原来的对象,这个过程称之为串行化(也叫序列化), 就像我们现在想把一辆汽车通过轮船运到美国去,因为 ...

  4. flask mysql

    sudo apt-get install mysql-servermysql -u root -p sudo apt-get install python-mysqldb sudo apt-get i ...

  5. PHP Mysql类【转】

    前几天没事在网上转发现了一个类,记录下来: <?php Class DB { private $link_id; private $handle; private $is_log; privat ...

  6. OBJC运行时方法替换(Method swizzling)

    在上周associated objects一文中,我们开始探索Objective-C运行时的一些黑魔法.本周我们继续前行,来讨论可能是最受争议的运行时技术:method swizzling.   Me ...

  7. 生成mif文件的几种方法总结

    mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.生成QuartusII11.0可用的mif文件,有如下几种方式: 方法1:利用Q ...

  8. .c 文件取为.o文件

    $(xxx:%.c=%.o) 即可 例子: $(ALLFILES:%.c=%.o)

  9. [BZOJ 1055] [HAOI2008] 玩具取名 【记忆化搜索】

    题目链接:BZOJ - 1055 题目分析 这种类似区间 DP 的记忆化搜索都是很相近的,比如字符串压缩和字符串扩展都差不多. 都是将现在 Solve 的区间分成子区间,再求解子区间. 这道题 Sol ...

  10. 苦练SOC“基本功”启明星辰九年磨一剑

    2011年9月28日——10月31日,国内知名网络安全公司——启明星辰,作为协办方参与了51CTO在2011年举办的中国SOC安全管理平台市场应用现状调查. SOC(Security Operatio ...