博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flutter学习篇(二)—— Drawer和水纹按压效果
阅读量:6232 次
发布时间:2019-06-21

本文共 4750 字,大约阅读时间需要 15 分钟。

导航

前言

笔者的Flutter练手项目代码都放在,有需要的可以star噢。看完觉得有帮助的话,可以动手点个赞?。

主题

今天分享的是一个常用功能——水纹按压效果,效果如下:

这个效果就是安卓手机常见的按压水纹效果。

例子

看完效果,我们开始进入写例子的环节,其实例子就是上图,是我模仿Gmail做的一个效果图:

主体框架就是安卓的Drawer效果,对于Drawer,Flutter支持的很好,使用起来很简单,如下:

@override  Widget build(BuildContext context) {    final currentPage = _getDrawerItemWidget(_selectedPageKey);    return Scaffold(      appBar: Common.appBar(title: currentPage.title),      extendBody: true,      drawer: _buildDrawer(),      body: currentPage,    );  } _buildDrawer() {    List
drawerOptions = []; widget.drawerItems.forEach((String key, DrawerItem item) => drawerOptions.add( DrawerRippleItem( iconPath: item.iconPath, title: item.title, highlightColor: item.highlightColor, contentHighlightColor: item.contentHighlightColor, isSelect: key == _selectedPageKey, tapCallback: () => _onSelectItem(key), ) )); return Drawer( child: Container( color: Colors.white, child: Column( children:
[ Container( height: 100, margin: EdgeInsets.fromLTRB(16, 32, 0, 0), child: Center( child: Row( crossAxisAlignment: CrossAxisAlignment.center, children:
[Common.circleAvatar(size: 64.0, path: "ic_default_avatar.webp")], ), ), ), Column(children: drawerOptions) ], ))); }复制代码

就是在Scaffold这个脚手架Widget增加一个drawer属性即可,具体我也不细讲,感兴趣可以看完整代码。

说回水纹按压,需要用到三个widget,分别是Material,Ink, InkWell。Material就是提供安卓设计风格的支持,Ink翻译过来就是油墨的意思,是水纹效果的外层容器,相当于Container,InkWell则是水纹的真实容器,其中包含水纹颜色等属性,代码如下:

import 'package:flutter/material.dart';class RippleItem extends StatelessWidget {  RippleItem({Key key,    this.isSelect = false,    this.itemHeight = 48.0,    this.highlightColor = const Color(0xFFE1F5FE),    this.normalColor = Colors.white,    this.rippleColor,    this.tapCallback,    this.borderRadius = const BorderRadius.all(Radius.zero),    this.content,  }) : super(key: key);  final bool isSelect;  final double itemHeight;  final Color normalColor;  final Color highlightColor;  final Color rippleColor;  final GestureTapCallback tapCallback;  final BorderRadius borderRadius;  final Widget content;  @override  Widget build(BuildContext context) {    return Material(        color: normalColor,        child: Ink(            decoration: BoxDecoration(                color: isSelect ? highlightColor : normalColor,                borderRadius: borderRadius            ),            child: InkWell(                splashColor: rippleColor != null ? rippleColor : Theme.of(context).splashColor,                borderRadius: borderRadius,                onTap: tapCallback,                child: Container(                  height: itemHeight,                  child: content,                ))));  }}复制代码

可以发现在Flutter中,视觉效果就是Widget的叠加,俗称嵌套地狱。在完成了RippleItem的封装后,我在之上又加了DrawerRippleItem的封装,如下:

import 'package:flutter/material.dart';import 'package:flutter_demo/widget/ripple_item.dart';import '../common_widget.dart';class DrawerRippleItem extends StatelessWidget {  DrawerRippleItem({    Key key,    this.isSelect = false,    this.iconPath,    @required this.title,    this.highlightColor,    this.contentHighlightColor,    this.tapCallback,  }) : super(key: key);  final String iconPath;  final String title;  final Color highlightColor;  final Color contentHighlightColor;  final bool isSelect;  final GestureTapCallback tapCallback;  final Color normalColor = Color(0xFF262d50);  @override  Widget build(BuildContext context) {    return Container(      margin: EdgeInsets.only(right: 4.0),      child: RippleItem(        isSelect: isSelect,        tapCallback: tapCallback,        highlightColor: highlightColor,        borderRadius: BorderRadius.only(          topRight: Radius.circular(24.0),          bottomRight: Radius.circular(24.0),        ),        content: Container(            padding: EdgeInsets.only(left: 24.0),            child: Row(              crossAxisAlignment: CrossAxisAlignment.center,              children: 
[ Container( child: Common.iconImage(path: iconPath,color: isSelect ? contentHighlightColor: normalColor), margin: EdgeInsets.only(right: 24.0), ), Common.primarySmallTitle(content: title, color: isSelect ? contentHighlightColor: normalColor) ], )), ), ); }}复制代码

其实就是增加了Radius属性,形成圆角效果,到这里已经大功告成了。

总结

本篇主要介绍了Flutter的Drawer和水纹效果的简单使用,在Flutter的世界里,万物皆Widget,各种效果也是各种Widget的嵌套,从而达到酷炫的效果。优点是可以组合各种各样的效果,缺点则是嵌套地狱。

仓库

点击,查看完整代码。

参考

转载地址:http://biana.baihongyu.com/

你可能感兴趣的文章
ObjectOutputStream和ObjectInputStream
查看>>
nagios客户端未启动报错
查看>>
南京大学周志华教授当选欧洲科学院外籍院士
查看>>
《OpenGL ES应用开发实践指南:Android卷》—— 1.3 初始化OpenGL
查看>>
马士兵教学语录
查看>>
计算机网络与Internet应用
查看>>
标签制作软件中如何导出标签模板为PDF文件?
查看>>
[CF919E]Congruence Equation
查看>>
Java IO最详解
查看>>
关于错误error C4430 error C2365 error C2078 error C2440 error C2143的处理。
查看>>
用python写一个抽奖程序
查看>>
npm使用入门(package.json)
查看>>
You are beautiful
查看>>
inline和宏之间的区别
查看>>
hibernate篇章五--Hibernage工作原理
查看>>
MongodDB学习笔记(二)(复制)
查看>>
oracle在线迁移同步数据,数据库报错
查看>>
Java中1.0 / 0.0 会输出什么?
查看>>
linux性能剖析工具
查看>>
DP ZOJ 3872 Beauty of Array
查看>>