android AppCompat, splash啟動白屏(黑屏)全屏,去掉狀態列,以及splash與虛擬按鍵遮擋
在做專案是,需要加一個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
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裡面增加主題
[html]
view plain
copy
print?
- <!--設定-全屏-->
- <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>
<!--設定-全屏-->
<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>
其中
[html]
view plain
copy
print?
- <item name="android:windowBackground">@drawable/bg_splash</item>
<item name="android:windowBackground">@drawable/bg_splash</item>
就是指定一幅啟動畫面,代替原來的白屏,從而去除白屏
//其他引數的作用在下面解釋
四、實現在splash隱藏狀態列,以及actionbar
在上面的主題裡面已經包含了設定全屏的引數,再次 列出:
[html] view plain copy print?- <item name="android:windowNoTitle">true</item>
- <item name="windowActionBar">false</item>
- <item name="android:windowFullscreen">true</item>
<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>
<item name="android:windowBackground">@drawable/bg_splash</item>
但是實際測試,這樣的啟動會非常的快,一閃而過(這種做,相當與把以前的白屏替代為自己的圖片,白屏是一閃而過)
因此這幾建議專門增設一個activity作為splashActivity,並在splashActivity控制splash時間。
這樣設計之後的效果是:一共有需要設定兩次背景圖片:
第一次:splashActivity通過theme設定的啟動背景
以下的設定方法:
- android:theme="@style/NoTitleFullscreen"
android:theme="@style/NoTitleFullscreen"
[html]
view plain
copy
print?
- <style name="NoTitleFullscreen" parent="AppTheme.NoActionBar">
- <item name="android:windowBackground">@drawable/bg_splash</item>
- </style>
<style name="NoTitleFullscreen" parent="AppTheme.NoActionBar">
<item name="android:windowBackground">@drawable/bg_splash</item>
</style>
第二次:splashActivity頁面背景
以下的設定方法:
在SplashActivity的資原始檔activity_splash.xml裡設定:
[html] view plain copy print?- android:background="@drawable/bg_splash"
android:background="@drawable/bg_splash"
六、在沒有實體按鍵的手機上,虛擬按鍵會遮擋啟動的splash造成顯示不完全
在沒有虛擬按鍵的手機上,這兩個背景顯示能完美對應,顯示正常。
但是在有虛擬按鍵的手機上,虛擬按鍵會影響第一次設定的圖片的正常顯示(圖片被虛擬按鍵遮擋)
針對這個問題在,NoTitleFullscreen裡面增加了如下選項;
- <item name="android:windowIsTranslucent">true</item>
<item name="android:windowIsTranslucent">true</item>
從而達到在有虛擬按鍵的的時候,正常顯示七、新增SplashActivity的延時java程式碼實現
[html] view plain copy print?- 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);
- }
- }