Android 动画animation 深入分析

15次阅读

转载请注明出处:

Android 动画animation 深入分析

前言:本文试图通过分析动画流程,来理解android动画系统的设计与实现,学习动画的基本原则,最终希望能够指导动画的设计。

0 本文中用到的一些类图

1 view animation

调用方法:view.startAnimation(animation);

public void startAnimation(Animation animation) {animation.setStartTime(Animation.START_ON_FIRST_FRAME);setAnimation(animation);invalidateParentCaches();invalidate(true);}在invalidate(ture);中if (p != null && ai != null) {final Rect r = ai.mTmpInvalRect;r.set(0, 0, mRight – mLeft, mBottom – mTop);// Don’t call invalidate — we don’t want to internally scroll// our own boundsp.invalidateChild(this, r);}即调用parent的invalidateChild,

假定父控件即为ViewRootImpl;

public final class ViewRootImpl implements ViewParent;

@Overridepublic void invalidateChild(View child, Rect dirty) {invalidateChildInParent(null, dirty);}public ViewParent invalidateChildInParent(int[] location, Rect dirty) {//…省略一堆判断条件,最终调用if (!mWillDrawSoon && (intersected || mIsAnimating)) {scheduleTraversals();}return null;} void scheduleTraversals() {if (!mTraversalScheduled) {mTraversalScheduled = true;mTraversalBarrier = mHandler.getLooper().postSyncBarrier();mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);scheduleConsumeBatchedInput();}}其中mTraversalBarrier = mHandler.getLooper().postSyncBarrier();是设置同步障碍(syncBarrier),当looper中的消息队列执行到barrier 后,会暂停执行,只有当barrier 被释放mHandler.getLooper().removeSyncBarrier(mTraversalBarrier); 后消息队列才能继续执行。

Choreographer mChoreographer; 是动画系统中的核心组织者, 负责统一调度。后面详细说。

final TraversalRunnable mTraversalRunnable = new TraversalRunnable();final class TraversalRunnable implements Runnable {@Overridepublic void run() {doTraversal();}} void doTraversal() {performTraversals();}perform 待补充 final class ConsumeBatchedInputRunnable implements Runnable {@Overridepublic void run() {doConsumeBatchedInput(mChoreographer.getFrameTimeNanos());}}final ConsumeBatchedInputRunnable mConsumedBatchedInputRunnable =new ConsumeBatchedInputRunnable();doConsume 待补充

2 属性动画aninmator

valueAnimator.start();

private void start(boolean playBackwards) {if (Looper.myLooper() == null) {throw new AndroidRuntimeException("Animators may only be run on Looper threads");} AnimationHandler animationHandler = getOrCreateAnimationHandler(); animationHandler.mPendingAnimations.add(this); if (mStartDelay == 0) { // This sets the initial value of the animation, prior to actually starting it running setCurrentPlayTime(0); mPlayingState = STOPPED; mRunning = true; notifyStartListeners(); } animationHandler.start(); }这里会检查调用线程必须是Looper线程,,如果是view相关的属性动画,还必须是UI 线程。

得到AnimationHandle 并把自己加入到PendingAnimations 的list中.

getOrCreateAnimationHandler(); protected static ThreadLocal<AnimationHandler> sAnimationHandler =new ThreadLocal<AnimationHandler>()protected static class AnimationHandler implements Runnable {// The per-thread list of all active animations/** @hide */protected final ArrayList<ValueAnimator> mAnimations = new ArrayList<ValueAnimator>();// Used in doAnimationFrame() to avoid concurrent modifications of mAnimationsprivate final ArrayList<ValueAnimator> mTmpAnimations = new ArrayList<ValueAnimator>();// The per-thread set of animations to be started on the next animation frame/** @hide */protected final ArrayList<ValueAnimator> mPendingAnimations = new ArrayList<ValueAnimator>();/*** Internal per-thread collections used to avoid set collisions as animations start and end* while being processed.* @hide*/protected final ArrayList<ValueAnimator> mDelayedAnims = new ArrayList<ValueAnimator>();private final ArrayList<ValueAnimator> mEndingAnims = new ArrayList<ValueAnimator>();private final ArrayList<ValueAnimator> mReadyAnims = new ArrayList<ValueAnimator>();private final Choreographer mChoreographer;private boolean mAnimationScheduled;}AnimationHandler 就是一个runnable, 注意成员变量中的多个animator 的list 以及重要的mChoreographer = Choreographer.getInstance();一路走来,我们无法猜测将是迎接什么样的风景,

正文完   
相关文章:
随机文章
申请速卖通直播需要满足哪些条件?需要准备什么材料?

申请速卖通直播需要满足哪些条件?需要准备什么材料?

随着互联网的发展,网络直播已经成为一种风靡全球的线上营销方式。其中,速卖通直播更是备受关注。很多商家都希望通过...
国际贸易人才培养模式分析,这些你必须掌握

国际贸易人才培养模式分析,这些你必须掌握

国际贸易人才培养模式分析,这些你必须掌握 随着全球化的发展,越来越多的企业开始涉足国际贸易,因此对于具备国际贸...
在亚马逊上卖什么产品比较好?有哪些热销的产品类别或品牌?

在亚马逊上卖什么产品比较好?有哪些热销的产品类别或品牌?

在亚马逊上卖什么产品比较好?有哪些热销的产品类别或品牌? 亚马逊,是全球最大的网络零售商,也是世界最知名的电子...
速卖通的满减活动适用于哪些商品?如何设置满减金额?

速卖通的满减活动适用于哪些商品?如何设置满减金额?

随着电子商务的发展,越来越多的商家选择在速卖通上开店,以期获得更广阔的市场和更多的消费者。而对于商家来说,如何...
对于速卖通无欧盟责任人,是否需要特别处理?欧盟责任人的义务是什么?

对于速卖通无欧盟责任人,是否需要特别处理?欧盟责任人的义务是什么?

对于速卖通无欧盟责任人,是否需要特别处理?欧盟责任人的义务是什么? 随着电子商务的发展,在线购物已经成为人们的...