Android动画深入分析读书笔记
Posted Flow_孙权
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android动画深入分析读书笔记相关的知识,希望对你有一定的参考价值。
动画主要分三种:View动画,帧动画,属性动画。性动画是API 11(android 3.0)的新特性,帧动画其实也是View动画的一种。
7.1View动画
(1).View动画支持四种动画效果:平移(TranslateAnimation),旋转(RotateAnimation),缩放(ScaleAnimation),透明度(AlphaAnimation).XML便签<set>是动画的集合,对应AnimationSet类,可以包好多个动画或者动画集合。
(2).<set>属性android:interpolator表示动画集合的插值器,插值器影响动画速度,不指定时有系统默认。
(3).android:shareInterpolator表示集合中的动画是否跟集合共享一个插值器,不指定时子动画须要单独指定或者使用默认值。
(4).andrroid:fillAfter表示动画结束后View是否停留在结束为止(动画结果是消失还是保留)。View动画是对View的影像做操作,并不能真正改变View的位置参数
(5)自定义View动画需要继承Animation抽象类,并重新它的initialize和applyTransformation方法,在initialize方法中做一些初始化工作,在applyTransformation方法中进行相应的矩阵变换,很多时候需要采用Camera类来简化矩阵变换的过程。
(6).帧动画其实就是一组图片的变化,通过类AnimationDrawable来使用,对应标签<animation-list>,android:oneshot表示是否重复播放。false表示重复。帧动画容易引起OOM,建议尽量避免尺寸过大图片。
7.2View动画使用的特殊场景
(1).LayoutAnimation
LayoutAnimation作用于ViewGroup,使其子View出场时具备动画。常被应用在ListView上。
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/layoutAnimation_demo_one"
android:animationOrder="normal"
android:delay="0.75" >
</layoutAnimation>
android:delay表示子元素开始动画的时间延迟,比如子元素入场动画的时间周期是300ms,那么0.5表示每个子元素都需要延迟150ms才能播放入场动画。
android:animationOrder子元素动画的顺序,normal表示排在前面的子元素先开始播放入场动画。reverse含义跟normal相反,random表示自由随机播放。
使用方法如下:
xml中直接指定使用:
android:layoutAnimation="@anim/layoutAnimation_demo"
代码中通过LayoutAnimationController实现:
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添加切换动画效果,但是往往有兼容性限制。Fragment也可以添加切换动画,通过FragmentTransaction中的setCustomAnimation来添加切换动画。
7.3属性动画
(1).默认动画间隔300ms,默认帧率是10ms/帧.作用对象不仅局限于View,对任何对象都可以,甚至还可以没有对象。属性动画是API11引进的特性,所以存在兼容性问题,可以考虑使用开源动画库nineoldandroids。它的功能和系统原生的android.animations.*中的类的功能完全一致,使用方法也是完全一样。比较常用的动画类:ValueAnimator,ObjectAnimator,AnimatorSet,ObjectAnimator继承自ValueAnimator。提供了ofInt、ofFloat、ofObject,这几个方法都是设置动画作用的元素、作用的属性、动画开始、结束、以及中间的任意个属性值。当对于属性值,只设置一个的时候,会认为当然对象该属性的值为开始(getPropName反射获取),然后设置的值为终点。如果设置两个,则一个为开始、一个为结束~~~
(2)xml定义属性动画时属性解析
<animator>对应ValueAnimator,<objectAnimator>对应ObjectAnimator,<set>标签对应的是AnimatorSet这个类,<set>标签其android:ordering属性两个值:together表示动画集合中子动画同时播放,sequentially表示子动画按照前后顺序播放,默认是together,代码中set.playTogether(),set.playSequentially();
android:startOffset动画延迟时间,android:repeatMode表示动画的重复模式,repeat表示连续重复播放,reverse表示逆向重复播放,也就是第一次播放完后第二次倒着播放动画,第三次还是重头开始播放动画,第四次再倒着播放,以此类推。android:repeatCount重复次数,默认0,-1表示无限循环。android:valueType表示android:propertyName所指定的属性类型,有“intType”和“floatType”两个可选项,如果android:propertyName所指定的属性表示是颜色,则不需要指定android:valueType。
(3)插值器和估值器:属性动画实现非匀速动画的重要手段
时间插值器(TimeInterpolator)的作用是根据时间流逝的百分比计算出当前属性值改变的百分比,系统内置的插值器有线性插值器(LinearInterpolator)匀速动画、加速减速插值器(AccelerateDecelerateInterpolator)动画两头慢中间快和减速插值器(DecelerateInterpolator)。类型估值器(TypeEvaluator)的作用是根据当前属性改变的百分比计算出改变后的属性值,系统内置的估值器有IntEvaluator、FloatEvaluator和ArgbEvaluator。插值器和估值器都是一个接口,我们可以自定义插值器或者估值器只需要实现该接口的方法。
(4)动画监听器
AnimatorListener:监听动画的开始、结束、取消以及重复播放;
AnimatorUpdateListener:监听动画的整个过程,动画每播放一帧的时候onAnimationUpdate方法就会被回调一次。
(5).对任意属性做动画
1.给对象加get和set方法,如果有权限的话。
2.用一个类包装原始对象,间接为其提供get和set,针对上述没有权限的情况。
3.采用ValueAnimator,监听动画过程,自己实现属性的改变。
final IntEvaluator mEvaluator=new IntEvaluator();
ValueAnimator valueanim=ValueAnimator.ofInt(1,100);
valueanim.addUpdateListener(new AnimatorUpdateListener()
@Override
public void onAnimationUpdate(ValueAnimator animation)
// TODO Auto-generated method stub
//获得当前进度占整个动画过程的比例,浮点型0-1之间
float fraction=animation.getAnimatedFraction();
int changeValue=mEvaluator.evaluate(fraction, 1, 100);
);
(6).属性动画工作原理:需要运行在有Looper的线程中,要求动画作用对象提供该属性的set方法,根据初始值和最终值多次调用set方法,最终所传递的值越来越接近最终值。如果没有给定初始值,则要提供属性的get方法。
7.4动画使用注意事项
(1).OOM问题:主要出现在帧动画中,图片数量多且图片较大,尽量少使用。
(2).内存泄露:属性动画中一类无限循环动画,需要在Activity退出时停止,否则会导致Activity无法释放而内存溢出,View动画不会出现。
(3).兼容性问题:某些动画在3.0以下系统上有兼容性问题
iew动画是对view的影像做动画,并不是真正的改变view的状态,因此有时候动画完成之后view无法隐藏,即setVisibility(View.GONE)失效了,此时需要调用view.clearAnimation()清除view动画才行。
(5)不要使用px
(6)动画元素的交互:在android3.0以前的系统上,view动画和属性动画,新位置均无法触发点击事件,同时,老位置仍然可以触发单击事件。从3.0开始,属性动画的单击事件触发位置为移动后的位置,view动画仍然在原位置
(7)硬件加速:使用动画的过程中,建议开启硬件加速,这样会提高动画的流畅性。
以上是关于Android动画深入分析读书笔记的主要内容,如果未能解决你的问题,请参考以下文章