Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Flutter自定义view —— 闯关进度条

Flutter自定义view —— 闯关进度条

原创
作者头像
CatEatFish
修改于 2020-07-09 06:24:22
修改于 2020-07-09 06:24:22
9810
举报
文章被收录于专栏:干活分享干活分享

1. 概述

因工作需要,需要自定义实现一个布局,当然用横向Row控件也可以实现这个效果,

但我觉得还是用自定义 view 实现效果比较好,想要什么效果都可以去实现,所以我按照

自己的想法写了一下这个自定义布局。

自定义view.gif
自定义view.gif

2. 实现思路:

看到这个布局,其实挺简单的,无非是画个圆画条直线,唯一一个困难点在于它的排列,说白了就是计算坐标

每个图形放置的位置,需要动态计算出来。

2.1 没有闯关时

没有闯关时,圆线条依次排列。

2.2 闯过一关后

闯过一关后,就分为闯过的关卡,与未闯过的关卡。为何单拎出来呢?因为需要计算当前关卡,并改换其它画笔,并且

因为半径不同,后续的坐标需要重新计算。

2. 效果实现分析

2.1 定义画笔

代码语言:txt
AI代码解释
复制
    //未通关圆
    Paint unPassCirclePaint = Paint()
      ..style = PaintingStyle.fill //画笔样式:填充
      ..color = Color(unPassCardColor) //画笔颜色
      ..isAntiAlias = true //是否抗锯齿
      ..strokeWidth = 20.0; //画笔宽度
    //通关圆最外层阴影
    Paint passFirstCirclePaint = Paint()
      ..style = PaintingStyle.fill
      ..color = Color(0x66FFEDEC)
      ..isAntiAlias = true
      ..strokeWidth = 20.0;
    //通关圆第二层阴影
    Paint passSecondCirclePaint = Paint()
      ..style = PaintingStyle.fill
      ..color = Color(0xffFFA9A6)
      ..isAntiAlias = true
      ..strokeWidth = 20.0;

    //通关圆
    Paint passCirclePaint = Paint()
      ..style = PaintingStyle.fill
      ..color = Color(passCardColor)
      ..isAntiAlias = true
      ..strokeWidth = 20.0;

    //未通关线条
    Paint unPassLinePaint = Paint()
      ..style = PaintingStyle.fill
      ..color = Color(unPassCardLineColor)
      ..isAntiAlias = true
      ..strokeCap = StrokeCap.round
      ..strokeWidth = 10.0;

    //通关线条
    Paint passLinePaint = Paint()
      ..style = PaintingStyle.fill
      ..color = Color(passCardLineColor)
      ..isAntiAlias = true
      ..strokeCap = StrokeCap.round
      ..strokeWidth = 10.0;

2.2:画-关卡圆

代码语言:txt
AI代码解释
复制
//画圆
/*
 * Offset c, 圆心坐标
 * double radius, 半径
 * Paint paint 画笔
 */
canvas.drawCircle(
           Offset(unPassRadius * (2 * i + 1) + i * lineWidth, passRadius),
           unPassRadius,
           unPassCirclePaint);

2.3:画-管卡之间的线条

代码语言:txt
AI代码解释
复制
//画线段
/*
 * Offset p1, 起点坐标
 * Offset p2, 终点坐标
 * Paint paint
 */
canvas.drawLine(
           Offset(
               (unPassRadius * 2 * (i + 1) + lineWidth * i) - 2, passRadius),
           Offset(unPassRadius * 2 * (i + 1) + (i + 1) * lineWidth + 2,
               passRadius),
           unPassLinePaint);

2.3:画文字

代码语言:txt
AI代码解释
复制
//创建一个文本绘制器
var textPainter = new TextPainter();
  //设置文本方向
   textPainter.textDirection = TextDirection.ltr;
   //设置文本样式
   textPainter.text = new TextSpan(
     text: strText,
     style: TextStyle(
       color: textColor,
       fontSize: 12.0,
       //基线,两个值,alphabetic 用来排字母的,ideographic 用来排表意字的(类似中文)
       textBaseline: TextBaseline.ideographic,
     ),
   );
   //计算用于绘制文本的字形的视觉位置。
   textPainter.layout();
   //获取文字宽度
   double width = textPainter.width;
   //获取文字高度
   double height = textPainter.height;
   //画文字
   textPainter.paint(canvas, new Offset(dx - width / 2, dy - height / 2));

2.4:打包封装使用

至于画笔画布的使用就不过多的解释了具体看这里:Flutter 自定义 View 介绍

代码语言:txt
AI代码解释
复制
class CustomView extends StatefulWidget {
  @override
  CustomViewState createState() => new CustomViewState();
}

class CustomViewState extends State<CustomView> {
  List<String> cardNameList=['说一说','比一比','学一学','秀一秀','赞一赞','赏一赏'];
  @override
  Widget build(BuildContext context) {

    return new Scaffold(
        appBar: new AppBar(
          title: new Text('custom_View'),
        ),
        body:
        SingleChildScrollView(
          padding: EdgeInsets.only(top: 20,left: 20),
          scrollDirection: Axis.horizontal,
          //用 CustomPaint 控件包裹 我们的自定义view
          child:  CustomPaint(
            size: Size((147*5+30).toDouble(), (30+10+20).toDouble()),
            painter: CustomPassCard(
              cartCount:6,
              ...各个参数
            ),
          ),
        )
    );
  }

注意点:

  1. 文字的坐标点,必须获取文字的宽高,然后再去设置文字的坐标点(Android 需要计算基线,flutter不需要)
  2. 绘制是从下往上绘制,也就是说先绘制的在下面,注意绘制时的遮盖问题。

3. 坐标点的计算

1.绘制每个控件都需要准确的坐标,圆的圆心坐标点,进度线的起始点与终点坐标点,自己在纸上画一画,

找到规律,总结成一个公式,然后套用。

2.还要在最外面设置size大小,size 大小也是动态计算的,计算出整个控件的宽度,高度可以定死


有啥不明白的随时联系我,稍后我会上传github,如果能帮助到你,麻烦点个赞

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Flutter 专题】33 自定义 View 之 Canvas (一)
和尚最近在学习自定义 View,刚了解了一下 Paint 画笔的神奇之处,现在学习一下 Canvas 画布的神秘之处。Flutter 提供了众多的绘制方法,和尚接触不深,尽量都尝试一下。
阿策小和尚
2019/08/12
1.1K0
【Flutter 专题】33 自定义 View 之 Canvas (一)
【Flutter 专题】33 自定义 View 之 Paint
Flutter 提供了与 Android 相似的 Paint 和 Canvas 来实现自定义 View,使应用更方便完善。和尚尝试学习和使用自定义 View。
阿策小和尚
2019/08/12
1.1K0
【Flutter 专题】33 自定义 View 之 Paint
flutter画笔paint的认识
两条线段连接处的形状。⚠️:strokeJoin在Canvas.drawPoints 画点时不起作用。
用户1974410
2022/09/20
1.5K0
flutter画笔paint的认识
[-Flutter 自组篇-] 圆形进度条
今天写个简单的,自定义一个圆形进度条,并且加上小箭头指向内圈进度。 进度条已上传到公网,使用circle_progress: ^0.0.1,使用如下 void main() => runApp(Ma
张风捷特烈
2020/04/30
1.8K0
[-Flutter 自组篇-] 圆形进度条
深入探索 Flutter 鸿蒙版的画笔使用与高级自定义动画
在 Flutter 中,绘图是一项强大的功能,可以帮助开发者创建自定义界面和独特的视觉效果。通过 CustomPainter 和 Canvas,我们可以实现复杂的图形和动画。本文将深入探讨 Flutter 中的画笔使用,包括如何编写高级自定义动画。
淼学派对
2024/11/04
490
Flutter:如何使用 CustomPaint 绘制心形
您可以在官方文档中找到有关 CustomPaint 小部件和 CustomPainter 类的更多详细信息:
徐建国
2021/10/18
9990
flutter的画布认识
下图代码详见: p03_canvas/06_like_circle/paper.dart#_drawArcDetail
用户1974410
2022/09/20
3.2K0
flutter的画布认识
Flutter 自定义 View 介绍
对于一些复杂或不规则的UI,我们可能无法使用现有的 Widget 组合去实现,比如需要一个带动画的进度条,
CatEatFish
2020/07/09
1.1K0
Flutter 自定义 View 介绍
[-Flutter 自组篇-] 蛛网图+绘制+动画实践
在Android的时候自定义过蛛网图,花了半天时间。复刻到Flutter只用了不到20分钟 不得不说Flutter中的Canvas对安卓玩家还是非常友好的,越来越觉得Flutter非常有趣。 在视
张风捷特烈
2020/04/30
1.4K0
[-Flutter 自组篇-] 蛛网图+绘制+动画实践
Flutter使用Canvas实现精美表盘效果
上个月参加掘金创作者训练营时,发现训练营中的一位兄弟通过 css3 实现了一个精美的表盘,效果看着确实不错很漂亮,跟 UI 做的设计图差不多了, 当时就在想能不能在 Flutter 中实现一个同样的效果,于是趁着周末空闲时间使用 Flutter 的 Canvas 使用了一个同样的效果。
loongwind
2022/09/27
1.4K1
Flutter使用Canvas实现精美表盘效果
flutter绘制的基础
我们去绘画的时候我们会想在哪画,画什么,怎么画。相对于画家这种创造性的职业,画什么是他们最难的。到我们我们程序员这里就不必考虑的太多。在哪画都是固定的,画什么需求都定好了,怎么画这才是考验我们程序员的。
用户1974410
2022/09/20
9520
flutter绘制的基础
【Flutter高级玩法】 贝塞尔曲线的表象认知
由于点位需要变化,BezierPainter只承担绘制的责任,这里在组件中定义点位信息_pos和选中索引_selectIndex ,通过构造函数传入BezierPainter。为了方便大家玩耍,我单独写个文件play_bezier2.dart里面有个PlayBezier2Page组件。
张风捷特烈
2020/04/30
1.7K0
【Flutter高级玩法】 贝塞尔曲线的表象认知
【Flutter 专题】84 图解自定义 ACEWave 波浪 Widget (二)
和尚继续完善前两天自定义 ACEWave 波浪组件,和尚预期的效果是多条波浪,渐变颜色,波浪宽高自定义等;
阿策小和尚
2020/04/27
4840
flutter画布绘制图片和文字
本节目标: [1]. 了解如何获取 [ui.Image] 对象。 [2]. 将一张图片使用 Canvas 绘制出来。 [3]. 知道如何从图片中取出部分图片绘制到指定矩形域中。 [4]. 了解 Canvas 绘制图集的操作。 [5]. 如何在 Canvas 中绘制文字,并完善坐标系刻度。 ---- 一、图片绘制: image-20201030110334887 绘制图片需要的是 ui.Image,需要异步加载,这里用 loadImageFromAssets 处理。 PaperPainter 接收 u
用户1974410
2022/09/20
2.6K0
flutter画布绘制图片和文字
【Flutter 专题】114 图解自定义 ACEProgressPainter 对比进度图
和尚今天绘制一个简单的 收入-支出 进度对比图;大致效果是在两个梯形中进行简单的内容展示;为了提高可复用性,和尚预先设定如下规则;
阿策小和尚
2021/03/22
7520
【Flutter 专题】114 图解自定义 ACEProgressPainter 对比进度图
【Flutter绘制集录】第二画: 流光
本文来通过一个小案例,介绍一下 Flutter 绘制 和 Flutter 动画 的使用。如下,是一个七彩的圆环,其中有两个动画效果:
张风捷特烈
2022/03/08
1.3K0
【Flutter绘制集录】第二画: 流光
【flutter高级玩法】贝塞尔实战1 - 波浪
一切视觉的动效都只是感性的欺骗,如我手中的线,跳动的人偶。她征服着你,我控制着她。--捷特
张风捷特烈
2020/04/30
1.2K0
【flutter高级玩法】贝塞尔实战1 - 波浪
Flutter EasyLoading - 让全局Toast/Loading更简单
Flutter是Google在2017年推出的一套开源跨平台UI框架,可以快速地在iOS、Android和Web平台上构建高质量的原生用户界面。Flutter发布至今,不可谓不说是大受追捧,吸引了大批App原生开发者、Web开发者前赴后继的投入其怀抱,也正由于Flutter是跨平台领域的新星,总的来说,其生态目前还不是十分完善,我相信对于习惯了原生开发的同学们来说,找轮子肯定没有了那种章手就莱的感觉。比如说这篇文章即将讲到的,如何在Flutter应用内简单、方便的展示Toast或者Loading框呢?
huangjianke
2020/02/23
5K0
flutter自定义组件
如何用canvas绘制我们任何想要任意图案的组件,这篇文章用自定义一个五角星组件来说明
韦东锏
2022/04/11
5510
flutter自定义组件
Flutter使用Canvas实现微信红包领取效果
前面写了一篇 Flutter 使用 Canvas 实现精美表盘效果[1] 的文章,对 Flutter 中的 Canvas 使用有了进一步的理解,就想着再用 Canvas 实现一个什么样的效果来加深一下对 Canvas 使用的理解,这个时候正好看到群里有人发红包,于是就想着能不能在 Flutter 中使用 Canvas 实现微信领取红包的效果?想到就做,知行合一,经过几天空余时间的研究,最终实现了微信领取红包效果,于是有了这篇文章。
loongwind
2022/09/27
1.7K0
Flutter使用Canvas实现微信红包领取效果
相关推荐
【Flutter 专题】33 自定义 View 之 Canvas (一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文