Flutter轻松实现Adobe全家桶Logo列表功能

版权声明:本文为博主原创文章,未经博主允许不得转载。
https://www.jianshu.com/p/760906fc2879

转载请标明出处:
https://www.jianshu.com/p/760906fc2879
本文出自 AWeiLoveAndroid的博客

本文首发在公众号Flutter那些事,未经允许,严禁转载。

本文配套代码已经传到了github,欢迎朋友们给个star,感谢大家,希望能在帮助大家的同时,麻烦大家给个打赏买口水喝,谢谢大家。

开源仓库地: https://github.com/AweiLoveAndroid/Flutter-learning/


Flutter系列博文链接 ↓:

工具安装:

Flutter基础篇:

Flutter进阶篇:

Dart语法系列博文链接 ↓:

Dart语法基础篇:

Dart语法进阶篇:


本文首发在公众号Flutter那些事,未经允许,严禁转载。

Adobe公司的产品大家应该都是很熟悉了,我们就看它的产品Logo,一看就可以记住好几个,比如:PS、Ai、Pr、Dw等。而且绝大多数Logo都是很一致的,外面要么方正,要么是带圆弧的矩形,中间是两个英文字母,第一个字母大写,第二个字母小写。总之,一看就可以让人记住,真是具有的魔性Logo,不得不佩服Adobe公司设计Logo的团队的创意人才,今天我要给大家带来的是使用Flutter实现Adobe公司的Logo并让它们同屏展出,全部用代码实现,不借助任何外部工具,一次性带领大家看看这些有趣的Logo。作者写文章不容易,觉得好看的话,点个赞支持一下吧,谢谢大家。

本文内容图文并茂,希望大家可以认真看完。为了避免大家犯困,我这里特意准备了本文配套的两个视频,下面这个是腾讯视频的播放链接:

腾讯视频链接:Flutter轻松实现Adobe全家桶Logo列表功能

如果你喜欢去B站观看本文配套的视频讲解,请点击Bilibili链接:

B站链接: Flutter轻松实现Adobe全家桶Logo列表功能

按照国际惯例,先来一张效果图镇楼。

Flutter打造Adobe全家桶Logo

怎么样?是不是很牛逼!!!下面开始带领大家直接撸码:

本文配套源码,你可以在我的github下载:https://github.com/AweiLoveAndroid/Flutter-learning


首先创建列表

首先我们创建一个GridView,我们使用GridView.count,然后我们先用10个Container填充一下,也就说每一个item都是Container,里面是一个居中的Text,Container的代码如下:

 Container(
  decoration: BoxDecoration(
    color: Colors.grey,
    border: Border.all(color: Colors.blue, width: 5),
  ),
  child: Center(
    child: Text(
      'No.1',
      style: TextStyle(
        fontSize: 35.0,
        color: Colors.blue,
        fontWeight: FontWeight.bold,
      ),
    ),
  ),
),

看看效果:

上边缘和左右两侧没有边距,看起来不太直观,给每一个Container外边加一点边距,修改后的代码如下:

Padding(
    padding: EdgeInsets.all(15),
    child: Container(...)
)

效果如图所示:

这里面由于文字太多了,所以一行显示不下了,可以把文字大小调小一点就OK了(暂且不用管它),接下来我们看我们的Padding加上Container的代码接近200行了,特别难看,不方便使用和管理,下面对它做一个封装,具体操作请看后文描述。


封装列表内容

首先我们看,哪些是变化的,哪些是不变的,方便我们传参。 padding属性是一致的,不用管它。 BoxDecoration里面的color属性和 BoxDecorationborder属性里的color属性都是变化的,需要外部传入的。接下来就是Text的文字内容,以及color都是需要外部传入的。所以这四个属性需要封装一下。我这里封装了一个函数,我把Padding加上Container的那一段代码拿过来了,然后把里面要传参的4个参数提取出来,作为函数的参数,然后我们调用这个函数,传入这4个参数返回是一个widget类型,这个要记住。接下来看一下代码:

Widget buildItems(
      String text, Color textColor, Color borderColor, Color bgColor) {
    return Padding(
      padding: EdgeInsets.all(15),
      child: Container(
        decoration: BoxDecoration(
          color: bgColor,
          border: Border.all(color: borderColor, width: 5),
        ),
        child: Center(
          child: Text(
            text,
            style: TextStyle(
              fontSize: 35.0,
              color: textColor,
              fontWeight: FontWeight.bold,
            ),
          ),
        ),
      ),
    );
  }

下面看看GridView代码对应的修改部分,代码如下所示:

GridView.count(
  crossAxisCount: 4,
  crossAxisSpacing: 5.0,
  mainAxisSpacing: 5.0,
  children: [
      buildItems('1', Colors.blue, Colors.blue, Colors.grey),
      buildItems('2', Colors.blue, Colors.blue, Colors.grey),
      buildItems('3', Colors.blue, Colors.blue, Colors.grey),
      buildItems('4', Colors.blue, Colors.blue, Colors.grey),
      buildItems('5', Colors.blue, Colors.blue, Colors.grey),
      buildItems('6', Colors.blue, Colors.blue, Colors.grey),
      buildItems('6', Colors.blue, Colors.blue, Colors.grey),
      buildItems('7', Colors.blue, Colors.blue, Colors.grey),
      buildItems('8', Colors.blue, Colors.blue, Colors.grey),
      buildItems('9', Colors.blue, Colors.blue, Colors.grey),
      buildItems('10', Colors.blue, Colors.blue, Colors.grey),
  ]
),

我们可以看到代码明显简洁了许多,看看使用效果图如何:


接下来填充具体的数据

部分代码如下所示:

GridView.count(
  crossAxisCount: 4,
  crossAxisSpacing: 5.0,
  mainAxisSpacing: 5.0,
  children: [
      buildItems('Ps',
        const Color(0XFF00C8FD),
        const Color(0XFF00C8FD),
        const Color(0XFF001C25)
      ),
      buildItems('Ai',
        const Color(0XFFFF7C00),
        const Color(0XFFFF7C00),
        const Color(0XFF271403)
      ),
      buildItems('Id',
        const Color(0XFFDA007A),
        const Color(0XFFDA007A),
        const Color(0XFF412E34)
      ),
      buildItems('Xd',
        const Color(0XFFFE2BC0),
        const Color(0XFFFE2BC0),
        const Color(0XFF2D001D)
      ),
      ...
  ]
),
...

截图如下所示:

自定义圆角弧度

我们发现有的有圆角,有的是没有圆角弧度的,所以这时候要对每一个Item进行个性化设置,圆角是在Container里面设置的,我么要对它进行操作,传入一个bool类型的值(也就是showRectRadis参数)进去判断即可,如果为true,那么就添加进去,如果为false,就保持默认的样式就好了,由于它是可选的参数,所以外面加一个大括号,同时这里面还用到“三目运算符”(不清楚 三目运算符 的可以看看我得博客Flutter基础篇(2)-- 老司机用一篇博客带你快速熟悉Dart语法)。下面看看代码是如何封装的:

  Widget buildItems(
      String text, Color textColor, Color borderColor, Color bgColor,
      {bool showRectRadis = false}) {
    return Padding(
      padding: EdgeInsets.all(15),
      child: Container(
        decoration: BoxDecoration(
          color: bgColor,
          border: Border.all(color: borderColor, width: 5),
          borderRadius: showRectRadis == true
              ? BorderRadius.circular(15)
              : BorderRadius.circular(0),
        ),
        child: Center(
          child: Text(
            text,
            style: TextStyle(
              fontSize: 35.0,
              color: textColor,
              fontWeight: FontWeight.bold,
            ),
          ),
        ),
      ),
    );
  }

然后我们要把children里面的代码也相应的做一个调整,如果要显示圆角的,就加上showRectRadis: true这句,其他的保持不变,修改后的部分代码如下所示:

GridView.count(
  crossAxisCount: 4,
  crossAxisSpacing: 5.0,
  mainAxisSpacing: 5.0,
  children: [
      buildItems('Ps',
        const Color(0XFF00C8FD),
        const Color(0XFF00C8FD),
        const Color(0XFF001C25),
        showRectRadis: true
      ),
      buildItems('Ai',
        const Color(0XFFFF7C00),
        const Color(0XFFFF7C00),
        const Color(0XFF271403)
      ),
      buildItems('Id',
        const Color(0XFFDA007A),
        const Color(0XFFDA007A),
        const Color(0XFF412E34)
      ),
      buildItems('Xd',
        const Color(0XFFFE2BC0),
        const Color(0XFFFE2BC0),
        const Color(0XFF2D001D),
        showRectRadis: true
      ),
      ...
  ]
),
...

我们来看看最终的效果,如下图所示:


到此为止,Flutter轻松打造Adobe全家桶Logo的功能已经实现了,是不是很简单?作者辛苦了,麻烦点个赞吧,谢谢大家。

关于作者:公众号“Flutter那些事”,独家放送最新Flutter、Dart和Fuchsia等技术动态,以及众多原创,有技术深度的技术干货文章,还有Flutter实战干货文章,等你来看,喜欢Flutter和跨平台开发以及原生移动端开发的朋友们,赶紧来看看,欢迎大家关注。

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

推荐阅读更多精彩内容