前言
在APP專案中閃屏頁(或啟動頁)的作用是為了解決在程式顯示第一幀之前,不要出現白屏的現象,尤其是在純RN和Flutter的專案裡面,資源載入完成到顯示的速度會比Native要遜色一些。這裡主要總結純Flutter專案可選擇的閃屏頁實現方案,大部分為 pub.dev 上比較受歡迎的幾種。
效果展示
Native 處理
有native開發人員,建議使用。
flutter_native_splash
第三方庫檔案 flutter_native_splash
用於自動生成用於在Android和iOS中新增初始螢幕的本機程式碼。使用特定的平臺,背景顏色和初始影像進行自定義。
使用方法
- 在
pubspec.yaml
檔案中新增flutter_native_splash
為dev
依賴項。
dev_dependencies:
flutter_native_splash: ^0.1.9
複製程式碼
-
flutter pub get
-
將以下設定新增到專案的pubspec.yaml檔案
flutter_native_splash:
image: assets/images/splash.png
color: "42a5f5"
android: false
複製程式碼
-
image
:必須是一個png檔案。 -
color
:"#42a5f5" 和 "42a5f5"均可 -
android
或ios
:到false,是否為特定平臺(ios/andorid)建立一個啟動畫面。 -
如果影像應使用所有可用的螢幕(寬度和高度),則可以使用fill屬性。
flutter_native_splash:
fill: true
複製程式碼
注意:fill iOS初始螢幕尚未實現該屬性。
- 如果要在Android上禁用全屏啟動螢幕,則可以使用android_disable_fullscreen屬性。
flutter_native_splash:
image: assets/images/splash.png
color: "42a5f5"
android_disable_fullscreen: true
複製程式碼
- 執行包 新增設定後,使用
flutter pub pub run flutter_native_splash:create
複製程式碼
程式包執行完畢後,您的初始螢幕已準備就緒。
注意:
- 對於安卓: 要想使用沉浸式狀態列需將以下程式碼註釋,見下圖
- 如果啟動螢幕在iOS上未正確更新,或者在啟動螢幕之前遇到白屏,請執行flutter clean並重新編譯您的應用。
- 這個包修改
launch_background.xml
,styles.xml
以及MainActivity
檔案在Android
和LaunchScreen.storyboard
,Info.plist
和AppDelegateiOS
上。
建議
如果要使用“材質圖示”作為初始影像,請在(material.io/resources/icons)中以Android的PNG格式下載圖示。我建議使用剛剛下載的資料夾中最大的圖示,以獲得更好的效果。drawable-xxxhdpi
材料顏色可在material.io/resources/color中
找到
實現原理
- Android
您的開機畫面將調整為
mdpi
,hdpi
,xhdpi
,xxhdpi
和xxxhdpi
可繪。 包含用於您的初始影像可繪製的標籤將新增到launch_background.xml
背景色將新增到中colors.xml
並在中引用launch_background.xml
。 styles.xml和會新增用於全屏模式切換的程式碼MainActivity。
下圖為執行成功後的安卓目錄結構圖
- iOS
您的啟動影像將被調整為
@3x
和@2x
影像。 顏色和影像屬性將插入中LaunchScreen.storyboard
。 隱藏狀態列切換的程式碼將新增到Info.plist
和中AppDelegate
。
可以按照下圖修改圖片的位置大小:
flare_splash_screen
第三方庫檔案 flare_splash_screen
用於載入程式具有啟動畫面並帶有Flare動畫的功能,直到完成一些用於初始化應用程式的工作為止。
使用方法
- 安裝 1.將庫新增到包的pubspec.yaml檔案中:
dependencies:
flare_splash_screen: ^3.0.1
複製程式碼
$ flutter pub get
複製程式碼
3.匯入
import 'package:flare_splash_screen/flare_splash_screen.dart';
複製程式碼
- Navigation
啟動螢幕將顯示動畫,並在完成後推送您指定的新路線,預設情況下會執行淡入淡出的動畫,但是您可以使用進行自定義
transitionsBuilder
SplashScreen.navigate(
name: 'intro.flr',
next: (_) => MyHomePage(title: 'Flutter Demo Home Page'),
until: () => Future.delayed(Duration(seconds: 5)),
startAnimation: '1',
),
複製程式碼
- Callback 初始螢幕將顯示動畫,並在onFinished完成時呼叫回撥。
SplashScreen.callback(
name: 'intro.flr',
onFinished: () {
Navigator.of(context).pushReplacement(PageRouteBuilder(pageBuilder: (_,__,___) => MyHomePage(title: 'Flutter Demo Home Page')));
},
loopAnimation: '1',
until: () => Future.delayed(Duration(seconds: 1)),
endAnimation: '1',
),
複製程式碼
- API
name
:閃屏頁動畫的路徑/名稱(需在pubspec.yaml中引入)
next
:閃屏頁動畫完成後進入的頁面/元件
loopAnimation
:要執行的動畫名稱,預設與第一個引數相同
startAnimation
:動畫在進入迴圈之前執行一次
endAnimation
:動畫稱一次執行until完成
until
:回撥,返回將來處理您的初始化
isLoading
:until如果要使用布林值管理載入狀態,則可以選擇
height
:閃屏頁動畫的高度,預設情況下會佔據所有可用位置
width
:強閃屏頁動畫的寬度,預設情況下會佔據所有可用位置
alignment
:閃屏頁動畫的對齊方式,預設居中
transitionsBuilder
顯示時適用的過渡 next
- 可用的動畫模式
- 只有一個動畫
基本上,您需要顯示一個動畫,然後只需要停留在最後一幀即可。為此,只需指定startAnimation
- 開始和迴圈動畫
您的動畫具有簡介和迴圈狀態,為此只能指定startAnimation
和loopAnimation
- 迴圈動畫
您的動畫具有完成和迴圈狀態,為此只能指定endAnimation
和loopAnimation
-
開始和結束的動畫 您的動畫有一個簡介和一個結束,該結束應停留在最後一幀,以便僅執行此操作
startAnimation
,endAnimation
-
開始,結束和迴圈動畫 您的動畫具有簡介,結束和迴圈狀態,以便指定
startAnimation
,endAnimation
和loopAnimation
- 小結
這種方案雖然很炫酷,但是並不能解決白屏的問題,從程式啟動到動畫載入之前還是會有白屏的現象。
總結
要想解決白屏還是離不開Native
的支援,有Native
開發者可以直接使用native
開發,沒有Native
開發者可以選擇flutter_native_splash
方案,可以利用flare_splash_screen
增加動畫效果。