Android动画总结系列(3)——补间动画源码分析

上文总结了Android补间动画的基本用法,Android补间动画的原理是通过给定初始帧和结束帧的值,再通过在给定时间间隔内计算插值并刷新界面,来形成渐变动画效果。Android补间动画包括四个基本效果:平移/旋转/缩放/透明度。上文由于篇幅原因没有解释其源码,本文专门分析补间动画的相关源码。

一、整体结构

Animation是四个基本动画效果的基类,其定义了动画的基础属性和获取变换(Transformation)的基本操作模板;
AnimationUtils是动画的执行帮助类,具体见第三章描述;
平移/缩放/旋转/透明度动画都是Animation的子类,AnimationSet动画集合是Animation动画的组合;

二、基类Animation

2.1 Animation支持的XML属性
duration:一次动画的执行耗时;
startOffset:动画从startTime到真正执行的等待事件,也就是开始偏移时间量;
fillEnabled:表示动画开始前和结束后是否还继续应用动画的转化效果,默认false;
fillBefore:动画开始执行前是否应用动画的转化效果,默认true;但受fillEnabled影响:fillEnabled=false,此方法值的false无效而true有效;fillEnabled=true,此方法的true/false都有效;
fillAfter:动画结束执行后是否应用动画的转化效果,默认false;也受fillEnabled影响:fillEnabled=false,此方法的false无效而true有效,fillEnabled=true,此方法的true/false都有效;
repeatCount:动画重复执行次数
repeatMode:动画重复执行时的模式,可以指定重复执行是从头执行或者逆序执行到头
zAdjustment:动画执行过程中待执行动画的View的展示层次
background:动画执行过程中的背景
detachWallpaper:如果动画是Window动画,而Window设置了背景,则此值true表示Window展示动画,而背景保持不动,不执行动画;false表示背景和Window一起执行动画;
interpolator:动画的插值器

2.2 构造器
2.2.1 Animation() 构造一个空动画(执行时间0,默认插值器,fillBefore为true而fillAfter为false)
2.2.2 Animation (Context context, AttributeSet attrs) 通过资源初始化一个动画,初始化上面列出的xml属性

2.3 关键方法与内部类
与set方法相对的get方法略去。

2.3.1 void reset():重置动画状态,回到初始初始状态;

2.3.2 void cancel():取消动画执行,此操作会调用动画监听器告知动画结束,如果手动调用cancel,则想要再次执行动画需要调用reset;

2.3.3 boolean isInitialized():判断动画是否已经初始化(initialized);

2.3.4 void initialize( int width, int height, int parentWidth, int parentHeight):传入需待执行动画的对象(一般是View)和其父元素的宽高,来初始化动画,这是为了支持上文中提到的RELATIVE_TO_SELF和RELATIVE_TO_PARENT属性;当待执行动画的对象和其父元素的宽高确定时,就应该调用此方法,同时,此方法应在getTransformation前调用。width/height代表待执行动画对象的宽/高,parentWidth/parentHeight代表待执行动画对象父元素的宽/高;
public void initialize(int width, int height, int parentWidth, int parentHeight) {
    reset();
    mInitialized = true;
}
需要注意的是,这段代码并没有真的对宽高进行操作,而是在子类中覆写此方法来使用宽高的。

2.3.5 void setListenerHandler(Handler handler):设置回调动画事件的Handler,注意,这个方法不是对外可见的,我们一般也不用上,除非说强烈需要动画回调到某个进程内去;

2.3.6 void setInterpolator(Context context, @InterpolatorRes int resID):设置动画插值器,传入resId;

2.3.7 void setInterpolator(Interpolator i):设置动画插值器,常用;

2.3.8 void setStartOffset( long startOffset):设置动画开始执行的时间偏移量(动画开始执行相对其开始执行时间的偏差),单位为毫秒,动画从时间startTime + startOffset开始执行,在AnimationSet中,某些子动画需要延迟执行,则可调用此方法;

2.3.9 void setDuration( long durationMillis):设置动画执行时间,不能为负数;

2.3.10 void restrictDuration( long durationMillis):指定动画最长可以执行的时间;此方法实现在预期执行动画时间超出durationMillis时,通过减少duration和repeatCount的值来保证动画总执行时间不超过durationMillis; 动画的一次执行时间等于 startOffset + duration;

2.3.11 void scaleCurrentDuration( float scale):将duration和startOffset缩放scale倍;

2.3.12 void setStartTime( long startTimeMillis):设置动画开始执行的时间;如果值被设为START_ON_FIRST_FRAME,动画将在第一次调用getTransformation时开始执行;此方法传入的startTimeMillis应使用;AnimationUtils.currentAnimationTimeMillis而非System.currentTimeMillis()获取;

2.3.13 void start():第一次调用getTransformation时开始执行动画;

2.3.14 void startNow():在当前时间开始执行动画;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值