Flutter 开发 Android & IOS 启动页 splash page

Hello,好久不见呀。最近对 Flutter 比较感兴趣,一直都在在看 Flutter 相关的内容。

准备简单的做一个 Flutter 的项目,也是好久没有更新博客了,正好结合里面启动页相关的内容写一篇博客。

Flutter

前言

启动页面(Splash)对于一个 APP 来说还是挺重要的,不设置启动页面打开 APP(特别是冷启动)时会有很长时间的白屏效果,这个对于用户体验来说,非常不友好。

OKay,下面开始进入启动页面的撰写。

Flutter 页面

资源引入

首先将启动页面的图片加入到项目目录:assets/images/splash.png,这里支持多分辨率图片,比如有 @3x 的图片可以放进 assets/images/3.0x/splash.png。这里的 @3x 和 IOS 是一样的。

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

资源文件

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

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

页面创建

启动页面首先也是一个页面,命名为 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 全屏的方式有两个选择:

  • BoxFit.fill
    以(上下左右)拉伸的方式充满屏幕,不裁剪原图;
    对应 IOS Content Mode:Scale to fill
    对应 Android xml 标签 <bitmap> 内属性 gravity:fill
  • BoxFit.cover
    以裁剪的方式充满屏幕
    对应 IOS Content Mode:Aspect fill

考虑到 Android 启动页面设置的全屏模式,这里选择 BoxFit.fill

完成后运行程序会发现还是会有短暂的白屏时间,这是因为程序启动时加载所致。现在就需要我们在原生项目中添加启动页面背景。

Android 启动背景

splash.png 按分辨率添加到对应的目录 mipmap-xhdpi/mipmap-xxhdpi/mipmap-xxxhdpi
mipmap-xxhdpi 对应的分辨率是 1080x1920

然后打开项目的 ./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 其实就是将多个 drawable 按照顺序层叠在一起显示,在最前面的比如上面被注释掉的

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

会显示在最底层,成为背景。这里我们只想设置图片,直接注释掉。

gravity 为 fill 会将图片拉伸充满屏幕,和我们之后出现的页面 splash_page.dart 里面的图片 fit: BoxFit.fill 保持一致。

此时 Android 程序启动时就没有白屏了。

IOS 启动背景

  1. 使用 xcode 打开项目的 ios 目录。

  2. 拖拽图片进 xcode 项目打开界面左侧 Runner 根目录。

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

    如图:

    image
  3. 完成后在左侧 Project navigator 打开文件 Runner/Runner/LaunchScreen.storyboard

    然后在中间部分点开 view tree,找到 LaunchImage。 如图:

    LaunchImage

    点击后查看右侧 Attributes inspector,在 image 一栏中填写 splash.png,并将 Content Mode 修改为 Scale To Fill

    splash-view-tree
  4. 选中图片,然后在左侧 View Controller scence 中选中并剪切该图片 splash.png 并粘贴,以清除十字线(约束)。

    编辑图片的约束,使其充满全屏幕。

    点击屏幕右下角的约束编辑器:

    splash-masonry

    将上面填空处都填 0,然后点击 Add 4 Constraints

  5. 现在运行 Flutter 项目到 IOS 设备可以发现启动时的白屏已经没有了。

效果

最后附下实际效果:

splash-ios-demo
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267