WallpaperToken 窗口动画分析(Android 10)

本文深入探讨了Android 10中WallpaperToken的窗口动画机制,包括创建Animation、startWallpaperAnimation的执行过程,以及如何通过RunningAnimation包装SurfaceControl和AnimationSpec来实现动画效果。关键在于通过mAnimation设置outTransformation并调用applyTransformation,以ScaleAnimation为例展示了动画的工作原理。
摘要由CSDN通过智能技术生成

WallpaperToken 窗口动画分析

// frameworks/base/services/core/java/com/android/server/wm/AppTransitionController.java
private void handleNonAppWindowsInTransition(int transit, int flags) {
   
    if (transit == TRANSIT_KEYGUARD_GOING_AWAY) {
   
        if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER) != 0
                && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) == 0
                && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION) == 0) {
   
            // 创建 Animation
            Animation anim = mService.mPolicy.createKeyguardWallpaperExit(
                    (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0);
            if (anim != null) {
   
                // 执行动画
                mDisplayContent.mWallpaperController.startWallpaperAnimation(anim);
            }
        }
    }
    if (transit == TRANSIT_KEYGUARD_GOING_AWAY
            || transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER) {
   
        mDisplayContent.startKeyguardExitOnNonAppWindows(
                transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER,
                (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0,
                (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION) != 0);
    }
}

创建 Animation

// frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
@Override
public Animation createKeyguardWallpaperExit(boolean goingToNotificationShade) {
   
    if (goingToNotificationShade) {
   
        return null;
    } else {
   
        return AnimationUtils.loadAnimation(mContext, R.anim.lock_screen_wallpaper_exit);
    }
}
// frameworks/base/core/res/res/anim/lock_screen_wallpaper_exit.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
    <alpha
        android:fromAlpha="1.0" android:toAlpha="0.0"
        android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
        android:interpolator="@interpolator/fast_out_linear_in"
        android:duration="200"/>

    <!-- Empty animation so the animation has same duration as lock_screen_behind_enter animation
         -->
    <translate android:fromYDelta="0" android:toYDelta="0"
        android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
        android:interpolator="@interpolator/linear"
        android:duration="300" />
</set>

执行动画 startWallpaperAnimation

// frameworks/base/services/core/java/com/android/server/wm/WallpaperController.java
class WallpaperWindowToken extends WindowToken {
   
    void startWallpaperAnimation(Animation a) {
   
        for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) {
   
            // 这里的 mWallpaperTokens 列表来自于 addWallpaperToken() 方法
            // 获取 WallpaperWindowToken
            final WallpaperWindowToken token = mWallpaperTokens.get(curTokenNdx);
            // 执行壁纸窗口动画
            token.startAnimation(a);
        }
    }

    private final ArrayList<WallpaperWindowToken> mWallpaperTokens = new ArrayList<>();

    WallpaperWindowToken(WindowManagerService service, IBinder token, boolean explicit,
                         DisplayContent dc, boolean ownerCanManageAppTokens) {
   
        super(service, token, TYPE_WALLPAPER, explicit, dc, ownerCanManageAppTokens);
        dc.mWallpaperController.addWallpaperToken(this);
    }
    void addWallpaperToken(WallpaperWindowToken token) {
   
        mWallpaperTokens.add(token);
    }
    void removeWallpaperToken(WallpaperWindowToken token) {
   
        mWallpaperTokens.remove(token);
    }
}

                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值