重学分屏之进入分屏进入动画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)!