首页 > 代码库 > WindowAnimator笔记

WindowAnimator笔记

文章仅记录自己的一点理解,仅供自己参考。

WindowAnimator是一个窗口动画推进类,从成员变量mAnimationRunnable可以看出来。google源码对应这个类的解释:“Singleton class that carries out the animations and Surface operations in a separate task on behalf of WindowManagerService.”,意思是代表WMS在一次分割的任务中执行动画和操作Surface。Android中动画就是被分割成多次任务,每次任务,WMS都会使用这个类来执行,说白了就是推进动画。

1、mAnimationRunnable

这个变量是动画中一次任务的入口。

        mAnimationRunnable = new Runnable() {
            @Override
            public void run() {
                synchronized (mService.mWindowMap) {
                    mService.mAnimationScheduled = false;
                    animateLocked();
                }
            }
        };
对animateLocked()代码添加了同步锁,意味着同一时刻最多只有一个线程执行这个段代码。

2、mDisplayContentsAnimators

表示Display动画。该变量对于只有一个显示屏幕的手机来说只有一个成员。

    private class DisplayContentsAnimator {
        ScreenRotationAnimation mScreenRotationAnimation = null;
    }
DisplayContentsAnimator只包含一个ScreenRotationAnimation成员变量,用来保存屏幕旋转动画,从日志看mScreenRotationAnimation一直为null,不知道为什么,屏幕旋转动画后续再研究。

3、mAnimTransactionSequence

记录播动画时调用WindowAnimator.updateWindowsLocked()的序列。

4、mForceHiding

mForceHiding主要有四种状态:KEYGUARD_NOT_SHOWN、KEYGUARD_ANIMATING_IN、KEYGUARD_SHOWN、KEYGUARD_ANIMATING_OUT。主要用来保存播动画过程中keyguard状态。如果出现keyguard界面,就需要重新考虑keyguard窗口之下的所有窗口的可见性,因为keyguard会强制性的隐藏keyguard窗口之下的所有其他窗口(状态栏、壁纸等除外)。对于没有设置FLAG_SHOW_WHEN_LOCKED属性的窗口,当keyguard来临时会将该窗口隐藏掉。在keyguard退出动画时会将隐藏的窗口显示出来,这时如果窗口的高度高于keyguard,那么焦点窗口可能就会发生变化。

5、















WindowAnimator笔记