美文网首页
Android 12启动页适配

Android 12启动页适配

作者: 周_0717 | 来源:发表于2022-02-17 19:33 被阅读0次

Android 12开始应用冷启动和温启动时,系统会默认先加载SplashScreen(如下布局)
,然后在应用Activity渲染第一帧得时候移除;

<android.window.SplashScreenView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="vertical">
    <View android:id="@+id/splashscreen_icon_view"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:layout_gravity="center"
          android:contentDescription="@string/splash_screen_view_icon_description"/>
    <View android:id="@+id/splashscreen_branding_view"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:layout_gravity="center_horizontal|bottom"
          android:layout_marginBottom="60dp"
          android:contentDescription="@string/splash_screen_view_branding_description"/>
</android.window.SplashScreenView>

SplashScreenView继承于FrameLayout,布局中包含一个居中的应用图标和一个置底的品牌图标。对应的配置,需要用到SDK 31新增的window属性:

设置启动页窗口填充内容(drawable),此drawable将会放置在windowBackground之上,且会缩放至保证边界在可视窗口范围内(受系统栏影响);
如果不希望显示系统栏,请使用全屏主题。
请注意,即使主题上没有设置windowSplashscreenContent,系统仍会使用其他属性配置启动页画面,
如windowBackground、windowSplashscreenAnimatedIcon。
<item name="android:windowSplashscreenContent" format="reference" />
设置启动页背景颜色,如果不指定,则系统将使用windowBackground。
<item name="android:windowSplashScreenBackground" format="color" />
设置启动页图标,图标在页面中心显示,如果资源为可执行动画的drawable,(如AnimationDrawable, AnimatedVectorDrawable)
则在展示启动页的同时会执行动画
<item name="android:windowSplashScreenAnimatedIcon" format="reference" />
设置启动页图标动画时间,单位毫秒,最大时长不超过1000ms。
<item name="android:windowSplashScreenAnimationDuration" format="integer" />
设置启动页底部品牌图,它可用来表示应用程序的生产商品牌。
<item name="android:windowSplashScreenBrandingImage" format="reference" />
设置启动页图标背景颜色,当图标颜色与窗口背景色差别不大时,设置此属性非常必要;
注意此背景图形会与图标一样,被UI遮罩裁剪。
<item name="android:windowSplashScreenIconBackgroundColor" format="color" />

上面提到的UI遮罩是Google为了解决各厂商对应用图标圆角不同,而导致图标不美观或者需要多套图标的问题,从Android 8.0开始,将应用图标拆分成背景,图标,遮罩3部分组合;


图标合成示意图

由于我们经常会在启动该页进行一些初始化或接口请求,所以需要在此页面停留超过1000ms,此时可以通过暂停activity渲染来达到延长显示。

final View content = findViewById(android.R.id.content);
ViewTreeObserver.OnPreDrawListener  preDrawListener=new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                // checkReady-->检查是否关闭SplashView
                if (checkReady()) {
                    content.getViewTreeObserver().removeOnPreDrawListener(this);
                    return true;
                } else {
                    return false;
                }
            }
        };
content.getViewTreeObserver().addOnPreDrawListener(preDrawListener);

如果应用图标动画时长1000ms不够用,可以添加动画结束监听,在默认动画结束后获取SplashScreenView进行操作;需要注意getSplashScreen是SDK 31后在Activity中新增的方法。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    getSplashScreen().setOnExitAnimationListener(new SplashScreen.OnExitAnimationListener() {
        @Override
        public void onSplashScreenExit(@NonNull SplashScreenView view) {
            //对SplashScreenView进行操作
            //使用SplashScreenView.getIconAnimationStart获取动画开始时间
        }
    });
}

使用AndroidX提供的兼容包向下兼容

  1. 添加依赖'androidx.core:core-splashscreen:1.0.0-alpha02'
    查看androidx最新版本
  2. 修改主题文件
    将‘android:’去掉,使用androidx兼容包中提供的属性,设置SplashView移除后Activity的样式‘postSplashScreenTheme’
<item name="windowSplashscreenContent" format="reference">…</>
<item name="windowSplashScreenBackground" format="color">…</>
<item name="windowSplashScreenAnimatedIcon" format="reference">…</>
<item name="windowSplashScreenAnimationDuration" format="integer">…</>
<item name="windowSplashScreenBrandingImage" format="reference">…</>
<item name="windowSplashScreenIconBackgroundColor" format="color">…</>
<item name="postSplashScreenTheme">…</item><!--必填,SplashView移除后使用此主题恢复Activity样式-->
  1. 在启动Activity的onCreate调用installSplashScreen
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    SplashScreen.installSplashScreen(this);
}

目前存在的问题:

  1. 不支持设置品牌图标
  2. 遮罩圆角固定为图标尺寸1/3,Android 12以下不同手机圆角不固定,可能造成显示不同

2022-02-17

相关文章

网友评论

      本文标题:Android 12启动页适配

      本文链接:https://www.haomeiwen.com/subject/ycmdlrtx.html