在做項目是,需要加一個splash,以美化應用,消除app啟動等待的乏味
一、使用環境
使用Android Studio activity 繼承 AppCompatActivity, 實作splash功能
測試環境,沒有虛拟傳回按鍵的安卓手機和帶有虛拟按鍵的手機,測試虛拟按鍵對splash的影響
二、目标與一般實作
一般實作splash是建立一個activity,然後在這個acrivity的xml檔案裡設定splash背景,這樣做的效果和沒有加splash的效果一樣,即有黑屏或白屏(看使用的主題而定)
三、實作啟動無白屏(黑屏)
實作無白屏的原理是,在activity的主題裡設定背景,即用自己的splash圖檔代替app啟動時的白屏(預設的啟動背景是白屏或黑屏)代碼如下:
注:以上這個theme就是完整的配置,直接設定NoTitleFullscreen 為啟動Activity的theme,就會得到完美的splash,代碼及使用方法如下:
<activity
android:name=".SplashActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:theme="@style/NoTitleFullscreen"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
在values/styles.xml裡面增加主題
<!--設定-全屏-->
<style name="NoTitleFullscreen" parent="AppTheme.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@drawable/bg_splash</item>
<item name="android:windowIsTranslucent">true</item>
</style>
其中
<item name="android:windowBackground">@drawable/bg_splash</item>
就是指定一幅啟動畫面,代替原來的白屏,進而去除白屏
//其他參數的作用在下面解釋
四、實作在splash隐藏狀态欄,以及actionbar
在上面的主題裡面已經包含了設定全屏的參數,再次 列出:
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowFullscreen">true</item>
五、除了設定啟動背景圖,還專門增加一個splashActivity 以實作穩定的啟動效果
從其他部落格可以看到,有的作者建議直接使用如下參數,去掉白屏,并且把此作為啟動splash
<item name="android:windowBackground">@drawable/bg_splash</item>
但是實際測試,這樣的啟動會非常的快,一閃而過(這種做,相當與把以前的白屏替代為自己的圖檔,白屏是一閃而過)
是以這幾建議專門增設一個activity作為splashActivity,并在splashActivity控制splash時間。
這樣設計之後的效果是:一共有需要設定兩次背景圖檔:
第一次:splashActivity通過theme設定的啟動背景
以下的設定方法:
android:theme="@style/NoTitleFullscreen"
<style name="NoTitleFullscreen" parent="AppTheme.NoActionBar">
<item name="android:windowBackground">@drawable/bg_splash</item>
</style>
第二次:splashActivity頁面背景
以下的設定方法:
在SplashActivity的資源檔案activity_splash.xml裡設定:
android:background="@drawable/bg_splash"
六、在沒有實體按鍵的手機上,虛拟按鍵會遮擋啟動的splash造成顯示不完全
在沒有虛拟按鍵的手機上,這兩個背景顯示能完美對應,顯示正常。
但是在有虛拟按鍵的手機上,虛拟按鍵會影響第一次設定的圖檔的正常顯示(圖檔被虛拟按鍵遮擋)
針對這個問題在,NoTitleFullscreen裡面增加了如下選項;
<item name="android:windowIsTranslucent">true</item>
進而達到在有虛拟按鍵的的時候,正常顯示
七、新增SplashActivity的延時java代碼實作
public class SplashActivity extends AppCompatActivity {
private final Handler mHideHandler = new Handler();
private final Runnable gotoPage = new Runnable() {
@Override
public void run() {
Intent mIntent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(mIntent);
finish();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
mHideHandler.postDelayed(gotoPage, 3000);
}
}