# 本文收获与价值
完成代码后您将收获以下界面:
本文涉及到的知识点:
FutureBuilder
;CustomPaint
与CustomPainter
;canvas.drawImageRect
,ImageStream
等;最终你将能够吧下面的精灵图按需展示:
# 准备工作
备注:本人的写作方式决定这并不是一篇可以直接直接阅读就能获取到全部代码的文章,偏向于鼓励您能实际动手操练一下。
本文是在前作手把手教你实现携程GridNav布局-hotel布局的代码基础上进行的,当然您也可以重开一个项目,即将要做的事情和前文并无关联性,好的让我们开始吧;
必备条件
添加 sub_nav 和相关资源
在
lib
同目录下新建images
目录,并将下载的精灵图改名为un_ico_subnav.png
后放入images
;在
lib
目录下新建sub_nav
文件夹,在sub_nav
目录下新建sub_nav_widget.dart
和sub_nav_sprites_image.dart
文件;在
pubspec.yaml
中添加资源依赖:然后
cmd
+s
,VSCode
将会运行flutter packages get
命令;
# 代码部分
在 flutter
要想精确的自己控制图片的显示效果,必须借助于 dart:ui
提供的 ui.Canvas
来进行自定义的绘制操作,常用方法为 void drawImageRect(Image image, Rect src, Rect dst, Paint paint) {}
, 这里的 Image
为 ui.Image
类型; 而我们在 Flutter
层使用的 Image
需要先转换为 ImageStream
类型,然后后通过其 addlistener()
方法,添加 ImageStreamListener
类型的实例,之后在 ImageStreamListener
实例的完成的回调中通过回调函数中 ImageInfo
的 image
属性获得 Canvas
绘制时需要的 ui.Image
;( iOS
的 UIImage
与 CGImage
?)
在
sub_nav_sprites_image.dart
中添加如下代码这里我们先不急着去实现自定义绘制,让我们先获取
ui.Image
;在
sub_nav_widget.dart
中添加如下代码:现在,让我们开始通过
AssetImage
来获取ui.Image
,如果您有疑问的话可以按住cmd
点击ImageProvider
然后往上翻,查看官方给出的例子;将
// todo: reader ui.Image
替换为如下代码:将
// todo: show SubNavSpritesImage
替换为:在
sub_nav_sprites_image.dart
中增加自定义绘制的代码:如上,我们自定义了一个
_SpritesPainter
用来绘制ui.Image
指定的区域;将
// todo: add customPaint
替换为如下代码:添加到
main.dart
,在main.dart
中将如下代码,添加到GridWidget()
下方然后
cmd
+s
后,F5
调试,您将看到如下界面:试着更改
sub_nav_widget.dart
中传入的showIndex
,你将看到不同的图标被绘制;好了让我们回到
sub_nav_widget.dart
添加如下布局代码:如上,代码逻辑很简单这里不做过多解释,然后将
// todo: modify column
替换为:cmd
+s
热更新后你将看到最终的效果:
感谢您的阅读。
# 彩蛋
最终我找到了降低Android Studio
对CPU
占用的办法(虽然现在CPU
温度还在67°
左右徘徊😅),详见:万能的stackoverflow。
Go to: Preferences > Version Control > Background. Now listed under ‘Background Operations’ are 6 options. I disabled the first three options which are:
Perform update on VCS in background, Perform commit to VCS in background, Perform checkout to VCS in background.