说起闪屏就会莫名的引爆我的小暴脾气,为什么这么说呢? 每次启动一个App我都要盯着手机屏幕傻不拉几的待上几秒钟,即使我知道了这个App的功能到底是TMD是做什么的。因此从内心深处,我对闪屏是抵触的。我知道我打开的是什么该死的APP,我也知道用它来干嘛,求求你只要让我用它就行 OKay??
好,吐槽完毕之后,让我们来看看谷歌对闪屏是抱什么态度:
Material Design:Launch screens 我擦嘞!什么情况,从Material Design规范看到,谷歌竟然有点鼓励我们使用闪屏的节奏?? 一定是我打开网页的方式不对, 用IE再打开试试,结果还是一样 T_T 明明记得谷歌是不支持我们使用闪屏的啊,有图有真相:
难道是谷歌在表演打脸??非也非也~ 我相信谷歌不会蠢到如此地步,其实老版本上的建议和材料设计中的规范并不矛盾,反而本质上是一致的。为什么这么说呢?通常情况下,许多APP启动(尤其是冷启动)的时候,会做一些初始化的工作,这就需要一定的时间,这种情况下,与其让用户对着一片空白屏幕发呆,为何不同时给用户展示一些真(傻)善(白)美(甜)的东西呢? 这就是谷歌所提倡的:不要浪费用户的时间,但是绝不能让用户对着一片空白屏幕撸!!
如下图所示:
好了,说了这么多,那如何使用正确的方式实现一个闪屏呢? 其实合理的实现一个闪屏可能跟你想的有点不太一样,你所看到的闪屏应该是在你调用填充布局的方法之前就已经准备完毕,因此,我们不适用xml布局文件,我们使用样式Style的方式来实现一个闪屏:
首先在res/drawable文件夹下创建background_splash.xml文件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@android:color/holo_blue_light">
</item>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/ic_launcher" />
</item>
</layer-list>
以上代码,我们做了一个布局层叠,背景是一个蓝色,然后还有一个机器人图片
接下来,书写我们启动Activity也就是SplashActivity的主题Theme,在styles.xml文件中添加如下代码:
<style name="SplashTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">@drawable/background_splash</item>
</style>
可以看到,在SplashTheme主题中,我们将窗口的背景设置为我们自己的布局层叠。
最后在AndroidManifest.xml文件中,指定SplashActivity的主题为SplashTheme,如下:
<activity
android:name="com.danny_jiang.splashdemo.SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
我们甚至都不需要在SplashActivity的onCreate方法中使用setContentView去设置布局内容,直接运行效果如下:
当然,实际操作中我们还是需要在SplashActivity中添加逻辑操作,比如去做数据的初始化,当数据初始化完之后,将SplashActivity关闭,并启动真正的首页,如下所示:
package com.danny_jiang.splashdemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ProgressBar;
public class SplashActivity extends Activity {
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
finish();
break;
case 1:
pb.incrementProgressBy(10);
break;
default:
break;
}
};
};
private ProgressBar pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_layout);
pb = (ProgressBar) findViewById(R.id.progressBar_Splash);
new Thread(){
public void run() {
for(int i = 0; i < 10; i++){
try {
Thread.sleep(1000);
handler.sendEmptyMessage(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
handler.sendEmptyMessage(0);
};
}.start();
}
}
运行效果如下: