当前位置: 首页 > news >正文

Android T startingwindow使用总结

startingwindow介绍

startingwindow是什么

在activity真正显示之前,可能要处理大量耗时任务,如进程创建,资源加载,窗口绘制等。所以在窗口的过渡动画完成之后,可能应用还没有完成页面的绘制,我们需要一个页面来等待真正的activity显示,下面的图就是应用启动时所显示的纯色背景,和icon

StartingWindow使用总结的目的

本次文章的分享不会讲解StartingWindow的窗口的添加流程和移除流程,在网上其他博客总结分享的已经很充分了,这篇博客主要是分享我们如何定制这个StartingWindow,和系统侧是如何处理的

定制属性有那些

这些属性本文章不会讲解完,至于会设计到那些,主要看后面的补充了

windowSplashscreenContent

<?xml version="1.0" encoding="utf-8"?>
<resources><style name="Theme.TestActivity03" parent="android:Theme.Material.Light.NoActionBar" ><item name="android:windowSplashscreenContent">@layout/activity_main</item></style>
</resources>

这段代码大家一定不陌生吧,这是配置一个activty的主题的,在其中指定一个windowSplashscreenContent,告诉系统我们的开屏内容主要显示我们自己设置的,

我们来看看底层是如何实现的

peekLegacySplashscreenContent 这段代码主要是获取应用设置的windowSplashscreenContent获取对应的资源id,用来显示对应的getDrawable(),如下,这是我设置的启动的背景

windowSplashScreenAnimatedIcon

<?xml version="1.0" encoding="utf-8"?>
<resources><style name="Theme.TestActivity03" parent="android:Theme.Material.Light.NoActionBar" ><item name="android:windowSplashscreenContent">@drawable/aa</item><item name="android:windowSplashScreenAnimatedIcon">@drawable/aa</item></style>
</resources>

这段代码新增了一个windowSplashScreenAnimatedIcon,设置显示的icon,我们先看看底层是如何实现的

在启动时,getWindowAttrs(context, mTmpAttrs);回去读取应用自己设置的所有属性,存给变量mSplashScreenIcon,

继续回到获取到的设置给iconDrawable = mTmpAttrs.mSplashScreenIcon;

      private SplashScreenView fillViewWithIcon(int iconSize, @Nullable Drawable[] iconDrawable,Consumer<Runnable> uiThreadInitTask) {Drawable foreground = null;Drawable background = null;if (iconDrawable != null) {foreground = iconDrawable.length > 0 ? iconDrawable[0] : null;background = iconDrawable.length > 1 ? iconDrawable[1] : null;}Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "fillViewWithIcon");final ContextThemeWrapper wrapper = createViewContextWrapper(mContext);final SplashScreenView.Builder builder = new SplashScreenView.Builder(wrapper).setBackgroundColor(mThemeColor).setOverlayDrawable(mOverlayDrawable).setIconSize(iconSize).setIconBackground(background).setCenterViewDrawable(foreground).setUiThreadInitConsumer(uiThreadInitTask).setAllowHandleSolidColor(mAllowHandleSolidColor);if (mSuggestType == STARTING_WINDOW_TYPE_SPLASH_SCREEN&& mTmpAttrs.mBrandingImage != null) {builder.setBrandingDrawable(mTmpAttrs.mBrandingImage, mBrandingImageWidth,mBrandingImageHeight);}final SplashScreenView splashScreenView = builder.build();Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);return splashScreenView;}}

在后续流程中会创建一个SplashScreenView,并且吧回到的各种参数设置给SplashScreenView,如下

    final SplashScreenView.Builder builder = new SplashScreenView.Builder(wrapper).setBackgroundColor(mThemeColor).setOverlayDrawable(mOverlayDrawable).setIconSize(iconSize).setIconBackground(background).setCenterViewDrawable(foreground).setUiThreadInitConsumer(uiThreadInitTask).setAllowHandleSolidColor(mAllowHandleSolidColor);

最后会把应用携带过来的参数设置给imageView.setBackground(mIconBackground);,显示对应的图标,

http://www.xdnf.cn/news/1087813.html

相关文章:

  • 深度剖析:向70岁老系统植入通信芯片——MCP注入构建未来级分布式通信
  • 容器技术技术入门与 Docker 环境部署
  • Flutter基础(前端教程④-组件拼接)
  • Python Web应用开发之Flask框架高级应用(三)——蓝图(Blueprints)
  • uniapp b树
  • 【LeetCode 热题 100】142. 环形链表 II——快慢指针
  • FairyGUI 实现 Boss 双层血条动画
  • Crazyflie无人机集群控制笔记(二)通过SDK实时对接Crazyswarm2及NOKOV度量动捕数据
  • jmeter 性能测试步骤是什么?
  • 代码详细注释:C语言实现控制台用户注册登录系统
  • C++进阶—二叉树进阶
  • [2025CVPR]SGC-Net:开放词汇人机交互检测的分层粒度比较网络解析
  • 【网络协议安全】任务14:路由器DHCP_AAA_TELNET配置
  • Redis基础数据结构
  • Serverless 数据库来了?无服务器数据库 vs 传统数据库有何不同?
  • 学习日记-spring-day43-7.8
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(1):新的开始-尊他开始
  • Docker企业级应用:从入门到生产环境最佳实践
  • ReactNative【实战系列教程】我的小红书 4 -- 首页(含顶栏tab切换,横向滚动频道,频道编辑弹窗,瀑布流布局列表等)
  • 论文略读:UniPELT: A Unified Framework for Parameter-Efficient Language Model Tuning
  • C++(STL源码刨析/vector)
  • PostgreSQL复制技术全解析:从物理复制到逻辑复制的实践指南
  • 从历史航拍图像中去除阴影
  • 把文件夹下所有的excle写入word文件中
  • Grok 4,来了。
  • 算法设计与分析 知识总结
  • Android中MVI架构详解
  • MATLAB/Simulink电机控制仿真代做 同步异步永磁直驱磁阻双馈无刷
  • 基于PHP/MySQL的企业培训考试系统源码,高并发、稳定运行,源码开源可二开
  • Android补全计划 TextView添加删除线、下划线、更新字体等效果