今天介绍Flutter如何制作启动页。
这里先看看官方文档介绍启动页时给出的示意图:
整个过程大致就这四步:
- 显示Android启动界面
LaunchTheme
- 显示普通主题
NormalTheme
- 普通主题退出到正式进入Flutter界面的过渡效果
- 正式进入Flutter界面
如何配置启动页
先看下面这张图,所有配置的东西都在这里面,不用写一行代码。
A:android\app\src\main\AndroidManifest.xml
文件中有主要的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
android:label="闪电侠学习" # 修改应用的名称,将显示在APP图标下面
android:icon="@mipmap/icon"> # 指定APP图标
android:name=".MainActivity" # 主要框架页面,你可以在kotlin下面发现MainActivity的定义
android:theme="@style/LaunchTheme" # 配置主题样式LaunchTheme
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background" # 第一加载
/>
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" # 第二加载
/>
|
B:android\app\src\main\res\values\*
定义资源文件
这个文件夹下面以XML格式定义了很多资源,资源文件名无所谓,关键是里面的标签。你会发现@style/LaunchTheme
这种资源就是在里面定义的。比如style.xml
文件:
1
2
3
4
5
6
7
8
9
10
|
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">@android:color/black</item>
</style>
</resources>
|
colors.xml
文件
1
2
3
4
5
6
|
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="orange">#FFAB40</color>
<color name="greens">#44CC11</color>
<color name="transparent">#00000000</color>
</resources>
|
C:android\app\src\main\res\drawable\*
定义可绘制的资源
1
2
3
4
5
6
7
8
9
10
11
|
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- <item android:drawable="@android:color/white" />-->
<item android:drawable="@color/orange" />
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch3" />
</item>
</layer-list>
|
D:针对不同屏幕大小的图片等文件放在mipmap-*dpi
中
你会发现下面 这种写法的图片文件都能在mipmap-hdpi
中找到,图片后缀无所谓png,jpg
都可以成功找到;但最好使用png
文件。
1
2
|
android:icon="@mipmap/icon"
android:src="@mipmap/launch3"
|
小结:
这些基本上就配置完了,不过实际的使用过程当中我没有看到2和3步的效果,不知道为什么。
改进启动页
一般APP的启动显示过程如下:
前面我们已经用配置的方式解决了"显示logo"的问题,接下来我显示“介绍页”或“推广页”,显示完这些后我们就直接进入APP首页了。直接上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
import 'package:flutter/material.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'login',
home: SplashScreen(),
routes: <String, WidgetBuilder>{
'/IndexPage': (context) => IndexPage()
},
);
}
}
class IndexPage extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('首页'),
centerTitle: true,
),
body: Center(
child: Text('显示内容',style:Theme.of(context).textTheme.button,),
),
);
}
}
class SplashScreen extends StatefulWidget {
@override
_SplashScreenState createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
child: Image.network('https://xxx.com/launch/t.png',fit: BoxFit.contain,),
);
}
@override
void initState() {
super.initState();
countDown();
}
void countDown(){
var _duration = Duration(seconds: 10);
Future.delayed(_duration, _indexPage);
}
void _indexPage(){
Navigator.of(context).pushReplacementNamed('/IndexPage');
}
}
|
在模拟器中运行上面的代码,执行过程中能看到三步,效果如下图所示
- 显示启动图片
- 显示网络加载的图片
- 进入首页
小结:
就这样一个简单的APP启动过程就制作好了,有打包图片的开机启动页,有网络拉取图片的广告推广页,最后再进入首页。是不是很简单?但是别看这就实现了,真正想做好还有很多地方需要调整和优化,比如中间过渡可能白屏的问题,要加入更多动画效果,推广页倒计时等。后面继续学习。
(完)