自学内容网 自学内容网

重学分屏之进入分屏进入动画Splash Screen图层剖析

背景:

首先大家都知道正常桌面点击Activity进行启动时候,都会先展示一个Splash Screen的窗口图层,这个Splash Screen一般展示样子一般都是一个带App Icon图标 + 背景色图。
具体可以抓取一下Winscope可以看出来
在这里插入图片描述
这Winscope明显也可以看到展示的图层是Splash Screen对应画面就是短信的Icon和一个背景色的图。这个是桌面首次点击App展示Splash Screen的情况,但是app进入分屏也抓取相关的Winscope,发现情况有些不一样了,具体可以看如下Winscope情况:

在这里插入图片描述明明看着确实Splash Screen图层,但是整个分屏进入动画过程都没有在录屏画面中看到有app的Icon+背景图画面展示过,下面就带大家来解密一下分屏进入动画情况下,到底是Splash Screen怎样的一个展示形式,同时带大家了解一个新的Splash Screen的类型type:

STARTING_WINDOW_TYPE_SOLID_COLOR_SPLASH_SCREEN。

剖析分屏进入动画Splash Screen情况

那到底是什么原因导致的分屏情况下Splash图层压根没看到呢?

为了验证这个问题,先尝试搞一个Activity会耗时4s才进行显示Activity,这样分屏启动时候Activity就会只有Splash图层持续4s,4s后才会有Activity的绘制。
在这里插入图片描述

修改后进入对这个Activity进入分屏看看
在这里插入图片描述
也就是这里证明其实Splash图层是有画面的,不过因为他是纯色没有对应的Icon图,这个没有Icon点其实也可以从日志也可以看出来。

具体可以通过如下日志看出区别:
正常桌面打开Activity会有展示Icon图的Splash

SplashScreenView: peekWindowBGColor estimatedWindowBGColor = -1
SplashScreenView: Build android.window.SplashScreenView{ee1e8e7 V.E...... ......ID 0,0-0,0}
SplashScreenView: Icon: view: android.widget.ImageView{4d0bc94 V.ED..... ......I. 0,0-0,0 #1020504 android:id/splashscreen_icon_view} drawable: com.android.wm.shell.startingsurface.SplashscreenIconDrawableFactory$ImmobileIconDrawable@4cd933d size: 560
SplashScreenView: Branding: view: android.view.View{c927732 G.ED..... ......I. 0,0-0,0 #1020503 android:id/splashscreen_branding_view} drawable: null size w: 0 h: 0 mBackgroundColor #-1

明显可以看出这里是icon图标展示在SplashScreenView。

分屏情况下打开Activity

SplashScreenView: Build android.window.SplashScreenView{f3e8fe8 V.E...... ......ID 0,0-0,0}
SplashScreenView: Icon: view: null drawable: null size: 0
SplashScreenView: Branding: view: android.view.View{2ec2601 G.ED..... ......I. 0,0-0,0 #1020503 android:id/splashscreen_branding_view} drawable: null size w: 0 h: 0 mBackgroundColor #-1
SplashScreenView: Build android.window.SplashScreenView{6966a83 V.E...... ......ID 0,0-0,0}
SplashScreenView: Icon: view: null drawable: null size: 0
SplashScreenView: Branding: view: android.view.View{6d17400 G.ED..... ......I. 0,0-0,0 #1020503 android:id/splashscreen_branding_view} drawable: null size w: 0 h: 0 mBackgroundColor #-328966

日志明显看出来SplashScreenView没有展示icon,icon大小都为0,这里最主要是创建SplashScreenView时候发现mSuggestType == STARTING_WINDOW_TYPE_SOLID_COLOR_SPLASH_SCREEN

frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
在这里插入图片描述
STARTING_WINDOW_TYPE_SOLID_COLOR_SPLASH_SCREEN解释如下:

    /**
     * Prefer solid color splash screen starting window.
     * @hide
     */
    public static final int STARTING_WINDOW_TYPE_SOLID_COLOR_SPLASH_SCREEN = 3;

可以看出来mSuggestType就是代表SplashScreenView要展示就是一个纯色画面。

那么这里的mSuggestType又是由哪里决定的呢?

frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java

在这里插入图片描述
frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/phone/PhoneStartingWindowTypeAlgorithm.java

public int getSuggestedWindowType(StartingWindowInfo windowInfo) {
  //省略
        if (taskSwitch) {//task切换
            if (allowTaskSnapshot) {
                if (windowInfo.taskSnapshot != null) {
                    return STARTING_WINDOW_TYPE_SNAPSHOT;
                }
                if (!topIsHome) {//也不是回到home
                    return STARTING_WINDOW_TYPE_SOLID_COLOR_SPLASH_SCREEN;
                }
            }
            if (!activityDrawn && !topIsHome) {
                return getSplashscreenType(isSolidColorSplashScreen, legacySplashScreen);
            }
        }
        return STARTING_WINDOW_TYPE_NONE;
    }

上面就展示出来设置为STARTING_WINDOW_TYPE_SOLID_COLOR_SPLASH_SCREEN的逻辑。

同时还有疑问,哪怕是纯色的没有Icon图标,正常情况下那也应该要显示纯色的画面啊当apha为1之后,这里其实是因为正式Activity展示后后会触发移除Splash,移除是一个过程,Splash自身逻辑会控制自己画面进行隐藏,如果要进行显示就需要屏蔽掉相关隐藏代码。

总结

本文主要带大家认识了一个新的StartingWindowType:STARTING_WINDOW_TYPE_SOLID_COLOR_SPLASH_SCREEN,它主要就代表当前SplashWindow展示的固定的一种颜色背景,没有Icon图标展示。在分屏进入动画过程中其实是也可以看到Splash的图层,但是真实画面录屏看不出来,其实是因为纯色背景自身有alpha值后就看不出来,还有就是Splash窗口自身在真实Activity启动后Splash窗口自身也会有相关的隐藏背景内容的情况。


原文地址:https://blog.csdn.net/learnframework/article/details/145269956

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!