Flutter 開發(fā) Android & IOS 啟動(dòng)頁 splash page

Hello伯病,好久不見呀。最近對 Flutter 比較感興趣明场,一直都在在看 Flutter 相關(guān)的內(nèi)容汽摹。

準(zhǔn)備簡單的做一個(gè) Flutter 的項(xiàng)目,也是好久沒有更新博客了苦锨,正好結(jié)合里面啟動(dòng)頁相關(guān)的內(nèi)容寫一篇博客逼泣。

Flutter

前言

啟動(dòng)頁面(Splash)對于一個(gè) APP 來說還是挺重要的,不設(shè)置啟動(dòng)頁面打開 APP(特別是冷啟動(dòng))時(shí)會(huì)有很長時(shí)間的白屏效果舟舒,這個(gè)對于用戶體驗(yàn)來說拉庶,非常不友好。

OKay秃励,下面開始進(jìn)入啟動(dòng)頁面的撰寫氏仗。

Flutter 頁面

資源引入

首先將啟動(dòng)頁面的圖片加入到項(xiàng)目目錄:assets/images/splash.png,這里支持多分辨率圖片夺鲜,比如有 @3x 的圖片可以放進(jìn) assets/images/3.0x/splash.png皆尔。這里的 @3x 和 IOS 是一樣的。

注:IOS @3x 渲染后的分辨率為 1080x1920币励,等于 Android 的 xxhdpi

資源文件

然后在 pubspec.yaml 文件中引入資源:

flutter:
  assets:
    - assets/images/splash.png

頁面創(chuàng)建

啟動(dòng)頁面首先也是一個(gè)頁面慷蠕,命名為 splash_page.dart

import 'package:flutter/material.dart';

class SplashPage extends StatefulWidget {
  SplashPage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  State<StatefulWidget> createState() {
    return _SplashPageState();
  }
}

class _SplashPageState extends State<SplashPage> {
  
  @override
  void initState() {
    // TODO: do something to init
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Builder(builder: (context) {
      return Container(
        child: Image(image: AssetImage('assets/images/splash.png'), fit: BoxFit.fill,),
      );
    });
  }
}

代碼很簡單食呻,就是一張圖片流炕,然后全屏填充。這里 fit 全屏的方式有兩個(gè)選擇:

  • BoxFit.fill
    以(上下左右)拉伸的方式充滿屏幕仅胞,不裁剪原圖每辟;
    對應(yīng) IOS Content Mode:Scale to fill
    對應(yīng) Android xml 標(biāo)簽 <bitmap> 內(nèi)屬性 gravity:fill干旧。
  • BoxFit.cover
    以裁剪的方式充滿屏幕
    對應(yīng) IOS Content Mode:Aspect fill影兽。

考慮到 Android 啟動(dòng)頁面設(shè)置的全屏模式,這里選擇 BoxFit.fill莱革。

完成后運(yùn)行程序會(huì)發(fā)現(xiàn)還是會(huì)有短暫的白屏?xí)r間峻堰,這是因?yàn)槌绦騿?dòng)時(shí)加載所致。現(xiàn)在就需要我們在原生項(xiàng)目中添加啟動(dòng)頁面背景盅视。

Android 啟動(dòng)背景

splash.png 按分辨率添加到對應(yīng)的目錄 mipmap-xhdpi/mipmap-xxhdpi/mipmap-xxxhdpi捐名。
mipmap-xxhdpi 對應(yīng)的分辨率是 1080x1920

然后打開項(xiàng)目的 ./android/app/src/main/res/drawable/launch_background.xml 文件闹击,添加如下代碼:

<?xml version="1.0" encoding="utf-8"?><!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--<item android:drawable="@color/blue" />-->

    <!-- You can insert your own image assets here -->
    <item>
        <bitmap
            android:gravity="fill"
            android:mipMap="true"
            android:src="@mipmap/splash"/>
    </item>
</layer-list>

layer-list 其實(shí)就是將多個(gè) drawable 按照順序?qū)盈B在一起顯示镶蹋,在最前面的比如上面被注釋掉的

<item android:drawable="@color/blue" />

會(huì)顯示在最底層,成為背景。這里我們只想設(shè)置圖片贺归,直接注釋掉淆两。

gravity 為 fill 會(huì)將圖片拉伸充滿屏幕,和我們之后出現(xiàn)的頁面 splash_page.dart 里面的圖片 fit: BoxFit.fill 保持一致拂酣。

此時(shí) Android 程序啟動(dòng)時(shí)就沒有白屏了秋冰。

IOS 啟動(dòng)背景

  1. 使用 xcode 打開項(xiàng)目的 ios 目錄。

  2. 拖拽圖片進(jìn) xcode 項(xiàng)目打開界面左側(cè) Runner 根目錄婶熬。

    勾選 Copy items if needed剑勾,選中 Create groups 并在下方勾選 Runner

    如圖:

    image
  3. 完成后在左側(cè) Project navigator 打開文件 Runner/Runner/LaunchScreen.storyboard赵颅。

    然后在中間部分點(diǎn)開 view tree虽另,找到 LaunchImage。 如圖:

    LaunchImage

    點(diǎn)擊后查看右側(cè) Attributes inspector饺谬,在 image 一欄中填寫 splash.png捂刺,并將 Content Mode 修改為 Scale To Fill

    splash-view-tree
  4. 選中圖片,然后在左側(cè) View Controller scence 中選中并剪切該圖片 splash.png 并粘貼募寨,以清除十字線(約束)族展。

    編輯圖片的約束,使其充滿全屏幕绪商。

    點(diǎn)擊屏幕右下角的約束編輯器:

    splash-masonry

    將上面填空處都填 0苛谷,然后點(diǎn)擊 Add 4 Constraints辅鲸。

  5. 現(xiàn)在運(yùn)行 Flutter 項(xiàng)目到 IOS 設(shè)備可以發(fā)現(xiàn)啟動(dòng)時(shí)的白屏已經(jīng)沒有了格郁。

效果

最后附下實(shí)際效果:

splash-ios-demo
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市独悴,隨后出現(xiàn)的幾起案子例书,更是在濱河造成了極大的恐慌,老刑警劉巖刻炒,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件决采,死亡現(xiàn)場離奇詭異,居然都是意外死亡坟奥,警方通過查閱死者的電腦和手機(jī)树瞭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爱谁,“玉大人晒喷,你說我怎么就攤上這事》玫校” “怎么了凉敲?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我爷抓,道長势决,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任蓝撇,我火速辦了婚禮果复,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唉地。我一直安慰自己据悔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布耘沼。 她就那樣靜靜地躺著极颓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪群嗤。 梳的紋絲不亂的頭發(fā)上菠隆,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音狂秘,去河邊找鬼骇径。 笑死,一個(gè)胖子當(dāng)著我的面吹牛者春,可吹牛的內(nèi)容都是我干的破衔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼钱烟,長吁一口氣:“原來是場噩夢啊……” “哼晰筛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拴袭,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤读第,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拥刻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜瞒,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年般哼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吴汪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒸眠,死狀恐怖漾橙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黔宛,我是刑警寧澤近刘,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布擒贸,位于F島的核電站,受9級(jí)特大地震影響觉渴,放射性物質(zhì)發(fā)生泄漏介劫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一案淋、第九天 我趴在偏房一處隱蔽的房頂上張望座韵。 院中可真熱鬧,春花似錦踢京、人聲如沸誉碴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黔帕。三九已至,卻和暖如春蹈丸,著一層夾襖步出監(jiān)牢的瞬間成黄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工逻杖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奋岁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓荸百,卻偏偏與公主長得像闻伶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子够话,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345