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);
}
}