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,启动速度当然很快。给用户带来愉悦的体验。

  • 相关阅读:
    Ubuntu中root用户和user用户的相互切换
    Linux扩展权限
    計蒜客/填志愿(匈牙利算法)
    計蒜課/排澇(Edmond-Karp)
    計蒜客/數正方形(dp)
    51nodcontest#24 A(xjb)
    計蒜客/节食的限制(01背包)
    計蒜客/小教官(xjb)
    atcoder#073D(枚舉)
    Educational Codeforces Round 20 C(math)
  • 原文地址:https://www.cnblogs.com/liyiran/p/5549250.html
Copyright © 2011-2022 走看看