zoukankan      html  css  js  c++  java
  • Android app Splash页的替代方案

    一般的App想要显示公司的log什么的,都会在启动的第一个页面显示,就是SplashActivity。

    目前在看到一个替代SplashActivity的方案。

    使用SplashActivity的时候,一般会等待几秒以后finish()该页面,进入MainActivity。

    替代方案:

    通过给theme设置一个属性:android:windowBackground,然后就可以显示了。

    具体方案:

    用户从 Home 启动一个应用,系统先解析该应用启动 Activity 所使用的主题(Theme,在Manifest 文件中定义的),并根据里面定义的基本元素来绘制一个初始界面,比如根据主题中定义的状态栏颜色和窗口背景(android:windowBackground )。当系统加载完该程序的所有资源并执行启动 Activity 的 onCreate 函数之后,就把初始界面替换为该 Activity 的实际界面。

    当系统加载完该应用的资源并执行完启动 Activity 的 onCreate 函数之后

    最简单的方式,就是把上面的背景图作为一张大图,设置到 android:windowBackground 中,但是这样做会有一个问题,不同的 手机屏幕大小会导致该图片被拉伸,导致公司的logo变形,这可不是我们希望的。 那么可以使用如下的方式来定义这个背景图:

     1 <layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
     2   <!-- 背景颜色,在上图中该颜色为黑色 -->
     3   <item android:drawable="@android:color/black"/>
     4   <!-- 黑色背景上的其他图片元素,比如 一个居中显示的 logo 图标-->
     5   <item>
     6     <bitmap
     7       android:src="http://blog.chengyunfeng.com/@drawable/product_logo_144dp"
     8       android:gravity="center"/>
     9   </item>
    10    <!-- 右上角的图标元素 -->
    11     <item >
    12         <bitmap android:src="http://blog.chengyunfeng.com/@drawable/top_right" android:gravity="top|right"/>
    13     </item>
    14  <!-- 最下面的文字,注意这里有个 bottom 设置 -->
    15     <item android:bottom=”@dimen/product_text_bottom”>
    16         <bitmap android:src="http://blog.chengyunfeng.com/@drawable/bottom_text" android:gravity="bottom"/>
    17     </item>
    18 </layer-list>

    注意上面的 android:opacity=”opaque” 属性,这个是为了防止在启动的时候出现背景的闪烁。

    在您的启动 Activity 的自定义 主题中设置 android:windowBackground 的值为 上面定义的 layer-list ,然后在 AndroidManifest.xml  中设置启动 Activity 的主题为该自定义主题,例如android:theme=”@style/AppTheme.Launcher” 。注意: 要设置到启动的 Activity 上而不要设置该主题到 Application 上,这样就导致所有 Activity 都具有该效果了。

    当 Activity 启动后要切换正常的主题只需要在 onCreate 函数中调用 setTheme 函数即可(注意:需要在 super.onCreate 函数之前调用),例如:

    1 public class MyMainActivity extends AppCompatActivity{
    2  @Override
    3   protected void onCreate(Bundle savedInstanceState) {
    4     // 必须在 super.onCreate 之前调用
    5     setTheme(R.style.MyTheme);
    6     super.onCreate(savedInstanceState);
    7     // ...
    8   }
    9 }

    使用这种方式实现的 启动界面类似于效果上类似于传统的 Splash 界面,但是有很多好处:

    1. 没有额外的 Splash Activity,我看到过很多开发者为了实现 设计师要求的 Splash 界面,单独使用一个 Activity 来显示 Splash 界面,并且等待一段时间(比如 5秒)后再 finish 该界面。

    2. 没有额外的性能损耗,这是利用系统特性来实现一个启动界面,并不需要单独实现一个 Activity 来消耗系统的资源。

    3. 没有额外的过度绘制。在 onCreate 函数中重新设置为正常的 theme,可以把自定义的启动背景图给删除掉,避免主题背景和自定义 View 背景造成的过度绘制。 你也可以通过  getWindow().setBackgroundDrawable(null); 来清除该自定义启动背景。

    4. 启动速度更快。由于没有额外的 Splash Activity,启动速度当然很快。给用户带来愉悦的体验。

  • 相关阅读:
    数据类型装换
    变量及数据类型
    27 网络通信协议 udp tcp
    26 socket简单操作
    26 socket简单操作
    14 内置函数 递归 二分法查找
    15 装饰器 开闭原则 代参装饰器 多个装饰器同一函数应用
    12 生成器和生成器函数以及各种推导式
    13 内置函数 匿名函数 eval,exec,compile
    10 函数进阶 动态传参 作用域和名称空间 函数的嵌套 全局变量
  • 原文地址:https://www.cnblogs.com/liyiran/p/5549250.html
Copyright © 2011-2022 走看看