Android Splash啓動頁秒開方案,適配全面屏

Android 應用啓動問題:

由於zygote進程創建新進程運行app是耗時的,所以頁面上會先出現黑屏或白屏,然後再進入app的第一個頁面。黑屏或白屏是系統添加再第一個啓動頁面前面的一個臨時窗口(StartingWindow)。
啓動頁樣式和解決方案:

一、從UI拿到的啓動頁,由一個純色或簡單漸變色背景+若干圖標組成,舉例如下:頁面上方一個logo 底部有一段話

在這裏插入圖片描述

這種啓動頁可以採用layer-list,設置背景顏色和圖片,然後Activity的主題中windowBackground使用layer-list
layer-list

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape >
            <solid android:color="@color/text_dark"/>
        </shape>
    </item>
    <item android:top="120dp">
        <bitmap android:src="@mipmap/ic_layer_splash_logo"
            android:gravity="center_horizontal|top" />
    </item>
    <item android:bottom="50dp">
        <bitmap android:src="@mipmap/ic_layer_splash_text"
            android:gravity="center_horizontal|bottom" />
    </item>
</layer-list>

style.xml

<style name="AppTheme.Launcher" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowBackground">@drawable/drawable_splash</item>
    </style>

清單文件中

<meta-data
            android:name="android.max_aspect"
            android:value="2.8" />
<activity
            android:resizeableActivity="true"
            android:name=".view.activity.SplashActivity"
            android:theme="@style/AppTheme.Launcher">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

SplashActivity中佈局文件中設置背景和圖片的位置,圖片的位置一定要和layer-list
中設置的一樣,否則背景和頁面切換的時候會看出不同,有違和感,比如我上方的圖標距離頂部都是120dp

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/text_dark_s"
    tools:context=".view.activity.SplashActivity">
    <ImageView
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="120dp"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        android:src="@mipmap/ic_layer_splash_logo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <ImageView
        android:layout_marginBottom="50dp"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginTop="120dp"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        android:src="@mipmap/ic_layer_splash_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>

當我們的手機是帶有虛擬導航或者叫虛擬按鍵的設備時,我們可以重寫SplashAcivity的onWindowFocusChanged方法,設置全屏和取消虛擬按鍵

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }

以上,基本可以解決Android P以下的適配問題
當程序運行再Android P和以上版本的時候,如果不做全面屏適配,會出現黑色狀態欄現象,頁面上下方向也有一些壓縮,即使設置了全屏顯示、statusBarColor爲透明、 navigationBarColor爲透明還是有問題
在這裏插入圖片描述

可以再onCreate中添加

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
            getWindow().setAttributes(lp);

}

LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES可以保證圖片不被壓縮,可以延伸到劉海或者挖孔區域
除了這一個取值,還有其它取值,具體可以點擊進去查看WindowManager的源碼查看。

以上就是第一種情況和解決方案

二、和第一個場景一樣

解決方案是直接設置背景,不給SplashActivity設置setContentView(R.layout.activity_splash);
直接在onCreate中跳轉下一個Activity,
這個方案不用在Splash頁面適配全面屏
layer-list和style和上一個方案一樣

public class SplashActivity extends BaseFragmentActivity implements View.OnClickListener {

    private Button btnJump;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//        setContentView(R.layout.activity_splash);

        initeMessage();//做其它初始化操作
        goMainActivity();//如果之前有異步操作,此方法放在異步執行之後
    }
}

三、啓動頁背景複雜,不是純色背景。可以採取多套圖片適配

參考
這種啓動頁項目中遇到過一次,個人感覺還是不好適配,總有個別機型有問題

四、使用.9圖

.9圖製作
如果歡迎頁整個使用.9圖的話,有可能會因爲圖片過大,報錯
Canvas: trying to draw too large(****bytes) bitmap
因爲.9圖片必須放在drawable目錄下,圖片太大會報錯,如果圖片放在mipmap-xhdpi或mipmap-hdpi等都不會報錯,但是.9圖必須放在drawable下,矛盾

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章