热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android开发分享Flutter实现App功能引导页

app功能介绍页,主要是由介绍app功能的几张图片和当前页指示符组成,如下效果我们来一步一步实现上面的界面,左右滑动切换显示功能页,这个可以通过

app功能介绍页,主要是由介绍app功能的几张图片和当前页指示符组成,如下效果

Flutter实现App功能引导页

我们来一步一步实现上面的界面,左右滑动切换显示功能页,这个可以通过pageview来实现,底部的指示符半透明覆盖在pageview上,开发过android同学知道可以用framelayout布局来实现,flutter上也有类似的控件stack,我们先完成骨架代码

  // an highlighted block  void main() => runapp(app());  class app extends statelesswidget {   @override   widget build(buildcontext context) {   return materialapp(    title: 'title',    theme: themedata(    primaryswatch: colors.blue,    ),    home: appfuncbrowse(),   );   }  }    class appfuncbrowse extends statefulwidget {   @override   _appfuncbrowsestate createstate() {   return _appfuncbrowsestate();   }  }    class _appfuncbrowsestate extends state {   @override   widget build(buildcontext context) {   return scaffold(    body: container(    color: colors.white,    child: stack(    children: [    ],    ),   ));   }  }

appfuncbrowse 就是我们功能介绍页,上面编译运行功能后,我们先来着手实现功能介绍页面切换,pageview主要有两类构建函数,一个是懒加载页面(适合页面很多时使用),一个是适合少量页面的一次性加载的,我们实例显示3个页面,就简单的用这种方式, pageview用到了pagecontroller用来控制显示哪一页,先定义它

  class _appfuncbrowsestate extends state {   pagecontroller _pagecOntroller= pagecontroller();   //省略...  }

有了pagecontroller我们就可以创建pageview,代码如下

  widget _createpageview() {   return pageview(    controller: _pagecontroller,    onpagechanged: (pageindex) {    setstate(() {     _pageindex = pageindex;     print(_pagecontroller.page);     print(pageindex);    });    },    children: [    container(     color: colors.blue,     child: center(     child: text('page 1'),     ),    ),    container(     color: colors.red,     child: center(     child: text('page 2'),     ),    ),    container(     color: colors.green,     child: center(     child: text('page 3'),     ),    ),    ],   );   }  @override   widget build(buildcontext context) {   // todo: implement build   return scaffold(    body: container(    color: colors.white,  //  margin: edgeinsets.only(top: mediaquery.of(context).padding.top),    child: stack(    children: [     _createpageview(),    ],    ),   ));   }

Flutter实现App功能引导页

到这里我们完成了一个可以左右滑动的功能页, 每页的内容大家可以自定义,一般是一张图片,我这里为了简单起见直接显示text,到目前为止我们离目标还缺一个页码指示器,学过ios的非常熟悉,需要用到uipagecontrol,可惜的是到目前为止flutter还没提供该原生控件,我们只能自己实现它,其实也很简单,代码如下:

   _createpageindicator() {   return opacity(    opacity: 0.7,    child: align(    alignment: fractionaloffset.bottomcenter,    child: container(     margin: edgeinsets.only(bottom: 60),     height: 40,     width: 80,     padding: edgeinsets.all(0),     decoration: boxdecoration(      color: colors.grey, //.withalpha(128),      borderradius: borderradius.all(const radius.circular(6.0))),     child: gesturedetector(      behavior: hittestbehavior.translucent,      ontapup: (detail) => _handlepageindicatortap(detail),      child: row(       key: _pageindicatorkey,       mainaxisalignment: mainaxisalignment.spaceevenly,       mainaxissize: mainaxissize.min,       children: [       _dotwidget(0),       _dotwidget(1),       _dotwidget(2),       ]),     ),    ),    ),   );   }

咋一看感觉好复杂,其实也很简单,学过设计模式的同学可能看出和装饰者模式一样,widget层次结构就类似这种模式,这也是flutter的强大之处,用现有的控件可以组合出各种效果,首先我们用opacity控件来封装子控件,设置opacity使其成为半透明,然后使用align控制其底部对齐,为了使其距离底部一段距离,还需要container来包装,为了实现圆角的container,强大的decoration属性就登场了,它能实现各种装饰效果,这里我们实现的效果是灰色背景和圆角。

现在讲完了这些装修,就剩下三个点了,三个点在同一水平线上,所以我们用row来做为父控件,row有几个属性值注意

 mainaxisalignment      主轴对齐方式,row的主轴是水平方向,
 crossaxisalignment     主轴的垂直方向对齐方式,row的主轴是水平方向,所以该字段表示上下对齐方式
 mainaxissize           主轴方向的大小,对row来说即宽度
与row对应的控件是column,其对应上面属性刚好相反

上面属性的其他值可以自己试验,我们这里用到

  mainaxisalignment: mainaxisalignment.spaceevenly,  mainaxissize: mainaxissize.min,

表示子控件左右(包含与父控件)间距相同,并且宽度保持最小,最后我们来实现三个点,当前页的对应的点颜色需要和其他未显示的页有所区别,我们需要记录当前是第几页,从而使对应的第几个点highlight显示

  class _appfuncbrowsestate extends state {   pagecontroller _pagecOntroller= pagecontroller();   int _pageindex = 0;

然后就可以创建点了

   _dotwidget(int index) {   return container(    width: 10,    height: 10,    decoration: boxdecoration(     shape: boxshape.circle,     color: (_pageindex == index) ? colors.white70 : colors.black12));   }

滑动pageview,需要更新_pageindex,从而对应的更新当前页对应的点的颜色

  return pageview(    controller: _pagecontroller,    onpagechanged: (pageindex) {    setstate(() {     _pageindex = pageindex;     print(_pagecontroller.page);     print(pageindex);    });    },

onpagechanged就是pageview换页的事件,这里需要调用setstate从而使widget重建更新当前页的点颜色
到这里为止就剩下点击点更新pageview的功能了,我们来实现点击功能,就是监听点击手势,代码如下

   _handlepageindicatortap(tapupdetails detail) {   renderbox renderbox =   _pageindicatorkey.currentcontext.findrenderobject();   size widgesize = renderbox.paintbounds.size;   offset tapoffset =   renderbox.globaltolocal(detail.globalposition);     if (tapoffset.dx > widgesize.width / 2) {    _scrolltonextpage();   } else {    _scrolltopreviouspage();   }   }

手势有一个属性behavior需要值得注意,默认值为defertochild,具体取值如下:

behavior: hittestbehavior.translucent 控制响应的点击区域:
translucent    表示整个区域,被遮挡的子视图也能响应
opaque          表示整个区域,被遮挡的子视图不能响应
defertochild    表示点击到子视图才响应,手势默认behavior

需要实现点击左半部分向前翻页,点击后半部分向后翻页,我们需要判断当前点击的区域,这就需要找到row的renderobject来获取控件区域,然后获取点击相对控件的偏移来确定,具体见代码,_pageindicatorkey就是传给row的key,具体定义如下

  class _appfuncbrowsestate extends state {   pagecontroller _pagecOntroller= pagecontroller();   int _pageindex = 0;   globalkey<_appfuncbrowsestate> _pageindicatorkey = globalkey();

现在只剩下前后翻页的代码了,代码如下

   _scrolltopreviouspage() {   if (_pageindex > 0) {    _pagecontroller.animatetopage(_pageindex - 1,     duration: const duration(milliseconds: 200), curve: curves.ease);   }   }

以上就是android开发分享Flutter实现App功能引导页的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<编程笔记>。


推荐阅读
  • Flutter 布局(四) Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth详解
    本文主要介绍Flutter布局中的Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth四种控件,详细介绍了其布局 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • C++ STL复习(13)容器适配器
    STL提供了3种容器适配器,分别为stack栈适配器、queue队列适配器以及priority_queue优先权队列适配器。不同场景下,由于不同的序列式 ... [详细]
  • [翻译]PyCairo指南裁剪和masking
    裁剪和masking在PyCairo指南的这个部分,我么将讨论裁剪和masking操作。裁剪裁剪就是将图形的绘制限定在一定的区域内。这样做有一些效率的因素࿰ ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
author-avatar
笃志单车小博_801
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有