【pub地址 】 【github地址】

dependencies:flutter_star: $lastVersion
复制代码

一、描述

目标: 使用canvas手工打造,一个完美的星星评分组件。

---->[StarScore 星星显示组件]----
[1] 比如显示4.2: 会有5颗星, 前四颗填满,后一刻填充20%
StarScore 为 Stateless组件,仅负责显示的需求---->[CustomRating 星星评分组件]----
[2] 可指定最大值,也就是显示多少个星星
[3] 点击时会改变状态,进行评分,支持半星评分
[4] 支持评分回调---->[StarWidget组件]----
[5]. 可定义星星的显示进度情况 0% ~ 100 % 无死角
[6]. 可定义星星的角数
[7]. 可定义星星的颜色、大小
复制代码

二 、StarScore

分数展示组件

名称 类型 功能 备注 默认
score double 分数 - 0
star Star 第四点 星星属性配置 Star()
tail Widget 尾部的组件 - null
StarScore(score: 4.8,star: Star(fillColor: Colors.tealAccent,emptyColor: Colors.grey.withAlpha(88)),tail: Column(children: <Widget>[Text("综合评分"),Text("4.8"),],),
),
复制代码

三 、CustomRating

评分组件

名称 类型 功能 备注 默认
max int 最大星星数 - 5
score double 分数 - 0
star Star 第四点 星星属性配置 Star()
onRating Fluction(double) 点击回调 @required null
1.最简使用
CustomRating(onRating: (s) {print(s);}),
复制代码

2.可高度定制
CustomRating(max: 6,score: 3.0,star: Star(num: 12,fillColor: Colors.orangeAccent,fat: 0.6,emptyColor: Colors.grey.withAlpha(88)),onRating: (s) {print(s);}),
复制代码

四 、Star

星星组件 : 高度可定制的配置类

名称 类型 功能 备注 默认
progress double 填充的进度 [0,1] 0.0
num int 星星的角数 大于3 5
fat double 星星的胖瘦 (0,1] 0.5
emptyColor Color 星星的色 - Colors.grey
fillColor Color 星星的填充色 - Colors.yellow
size double 星星的大小 - 20
1. 进度填充:progress

2. 星星的角数:num

3. 星星的胖瘦:fat

4. 星星的颜色:fillColor和emptyColor

展示结束,下面进入正文


一 、如何自定义绘制的组件

1.分析组件的需求,抽离出需要配置的属性
class Star {final int num;final double progress;final Color emptyColor;final Color fillColor;final double size;final double fat;const Star({this.progress = 0,this.fat = 0.5,this.fillColor = Colors.yellow,this.emptyColor = Colors.grey,this.num = 5,this.size = 25});
}
复制代码

2. 创建好画板准备开画
class _StarPainter extends CustomPainter {Star star;Paint _paint;Paint _filePaint;Path _path;double _radius;_StarPainter(this.star) {_paint = Paint()..color = (star.emptyColor)..isAntiAlias = true;_filePaint = Paint()..color = (star.fillColor);_path = Path();_radius = star.size / 2.0;}@overridevoid paint(Canvas canvas, Size size) {//TODO 绘制}@overridebool shouldRepaint(CustomPainter oldDelegate) {return true;}
}
复制代码

3.开画

如果说StarWidget是评分组件的基础,那么绘制的路径就是星星的灵魂
下面的nStarPath是绘制n角星路径的核心方法

  Path nStarPath(int num, double R, double r, {dx = 0, dy = 0, rotate = 0}) {_path.reset(); //重置路径double perRad = 2 * pi / num; //每份的角度double radA = perRad / 2 / 2 + rotate; //a角double radB = 2 * pi / (num - 1) / 2 - radA / 2 + radA + rotate; //起始b角_path.moveTo(cos(radA) * R + dx, -sin(radA) * R + dy); //移动到起点for (int i = 0; i < num; i++) {//循环生成点,路径连至_path.lineTo(cos(radA + perRad * i) * R + dx, -sin(radA + perRad * i) * R + dy);_path.lineTo(cos(radB + perRad * i) * r + dx, -sin(radB + perRad * i) * r + dy);}_path.close();return _path;}
复制代码

在初始化的时候为路径赋值

class _StarPainter extends CustomPainter {..._StarPainter(this.star) {..._path = Path();_radius = star.size / 2.0;nStarPath(star.num, _radius, _radius * star.fat);}
复制代码

绘制也非常简单,其中有个进度问题,可以先画背景的星星, 再画一个填充的星星,再用canvas.clipRect进行裁剪即可。

  @overridevoid paint(Canvas canvas, Size size) {canvas.translate(_radius, _radius);canvas.drawPath(_path, _paint);canvas.clipRect(Rect.fromLTRB(-_radius, -_radius, _radius * 2 * star.progress - _radius, _radius));canvas.drawPath(_path, _filePaint);}
复制代码

4.自定义组件

将画板放入CustomPaint中即可

 class StarWidget extends StatelessWidget {final Star star;StarWidget({this.star = const Star()});@overrideWidget build(BuildContext context) {return Container(width: star.size,height: star.size,child: CustomPaint(painter: _StarPainter(star),),);}
}
复制代码

这就是星星组件的所有代码,也不超过百行。


二 、StarScore的实现

该组件的目的是显示评分,可以精确的显示百分进度
其实也没啥,仅是用几个StarWidget拼起来而已,代码也就下面一丢丢

class StarScore extends StatelessWidget {final Star star;final double score;final Widget tail;StarScore({this.star = const Star(), this.score, this.tail});@overrideWidget build(BuildContext context) {var li = <StarWidget>[];int count = score.floor();for (int i = 0; i < count; i++) {li.add(StarWidget(star: star.copyWith(progress: 1.0)));}if (score - count > 0) {li.add(StarWidget(star: star.copyWith(progress: score - count)));}return Wrap(crossAxisAlignment: WrapCrossAlignment.center,children: [...li,SizedBox(width: 10,),if (tail!=null) tail],);}
}
复制代码

三 、StarScore的实现

由于点击需要自己响应进行状态改变,所以使用StatefulWidget 最核心的是GestureDetector进行触点的获取并计算出当前值。其中对.5进行处理,以及越界的处理。

class CustomRating extends StatefulWidget {final int max;final Star star;final double score;final Function(double) onRating;CustomRating({this.max = 5,this.score = 0,this.star = const Star(),@required this.onRating}): assert(score <= max);@override_CustomRatingState createState() => _CustomRatingState();
}class _CustomRatingState extends State<CustomRating> {double _score;@overridevoid initState() {_score = widget.score;super.initState();}@overrideWidget build(BuildContext context) {var li = <StarWidget>[];int count = _score.floor(); //满星for (int i = 0; i < count; i++) {li.add(StarWidget(star: widget.star.copyWith(progress: 1.0)));}if (_score != widget.max.toDouble())li.add(StarWidget(star: widget.star.copyWith(progress: _score - count))); //不满星var empty = widget.max - count - 1; // 空星for (int i = 0; i < empty; i++) {li.add(StarWidget(star: widget.star.copyWith(progress: 0)));}return GestureDetector(onTapDown: (d) {setState(() {_score = d.localPosition.dx / widget.star.size;if (_score - _score.floor() > 0.5) {_score = _score.floor() + 1.0;} else {_score = _score.floor() + 0.5;}if (_score >= widget.max.toDouble()) {_score = widget.max.toDouble();}widget.onRating(_score);});},child: Wrap(children: li,),);}
}
复制代码

四. 发布到pub

1.配置

需要在pubspec.yaml进行一些配置

name 是名称
description 是描述 60 ~ 180 之间,太短或太长会扣分
version 版本
author 作者信息,会报warning 但我就想写
homepage 主页
复制代码
---->[pubspec.yaml]----
name: flutter_star
description: You can create a star easily and decide how many angle or color of the star, even the fat and progress of the star.
version: 0.1.2
author: 张风捷特烈<1981462002@qq.com>
homepage: https://juejin.im/user/5b42c0656fb9a04fe727eb37/collections
复制代码

2.最好写个example

不然会扣分

它会在这里,给使用者看


3.发布到pub
flutter packages pub publish --server=https://pub.dartlang.org
复制代码

然后需要权限验证,记得全部复制在浏览器打开,不用在控制台点链接,由于控制台的换行而导致url不全。

然后就看你的网给不给力了。flutter_star 欢迎使用


尾声

另外本人有一个Flutter微信交流群,欢迎小伙伴加入,共同探讨Flutter的问题,期待与你的交流与切磋。

@张风捷特烈 2019.02.23 未允禁转
我的公众号:编程之王
联系我--邮箱:1981462002@qq.com --微信:zdl1994328
~ END ~

【 开源计划 - Flutter组件 】 星星也可以如此闪耀 flutter_star相关推荐

  1. 贝壳团队出品的 Flutter 组件库 Bruno 现已开源

    Bruno 是由贝壳「用户体验中心 & 移动端作业组」联合打造的一套企业级移动端 Flutter 组件库,于 12 月 10 日正式开源: 官网 https://bruno.ke.com/ P ...

  2. 艺街开放平台开源计划

    相信园子里也有一部分朋友听说过艺街开放平台了,还有很多关注过她的开发过程.之前是作为自己的一个创业项目,曾经辞职4个多月时间开发,受到很多朋友的支持和鼓励.其中最感谢的要算善友了,他不仅很支持并且给予 ...

  3. 蚂蚁金服启动分布式中间件开源计划,用于快速构建金融级云原生架构

    今天,蚂蚁金服正式宣布启动分布式中间件(Scalable Open Financial Architecture,以下简称 SOFA 中间件)的开源计划! SOFA 是蚂蚁金服自主研发的金融级分布式中 ...

  4. 网易数帆发布自主开源计划,聚焦云原生生产落地

    10月21日,一年一度的网易数字+大会在杭州拉开帷幕,网易数帆在会上发布了围绕云原生生产落地的自主开源计划,在这一主题下开源的KubeDiag.KubeCube.Hango(函谷)等云原生项目,以及未 ...

  5. NOW直播——Flutter组件化开发方案

    作者:腾讯NOW直播 -koudleren(任晓帅) 前言 前面讲了Flutter和Native的混合开发模式,Flutter作为Native工程的一个Module存在,这样可以有效的将Flutter ...

  6. 开源Vue表格组件,表格插件源码

    开源Vue表格组件,表格插件源码 前言: 关于html里面原生的table,通常满足不了程序员的要求.所以开发了一款表格插件,其功 能有: 1 导入json格式数据后,自动填充表格.表格长宽自适应.排 ...

  7. 【Flutter】自定义 Flutter 组件 ( 创建自定义 StatelessWidget、StatefulWidget 组件 | 调用自定义组件 )

    文章目录 一.Flutter 组件简介 二.Flutter 自定义 StatelessWidget 组件流程 1.导入父类包 2.选择继承的父类 3.设置成员变量及构造函数 4.重写 build 方法 ...

  8. 重磅!GitHub 开源负载均衡组件 GLB Director

    8 日,GitHub 发布了开源负载均衡组件 GitHub Load Balancer Director(GLB) Director,GLB 是 GitHub 针对裸机数据中心的可扩展负载均衡解决方案 ...

  9. 腾讯开源负责人许勇:未来开源计划重点是AI和服务小程序生态

    导读:2018年6月25日,Linux 基金会,集结世界顶级开发者的非营利开源组织,宣布腾讯成为基金会的最新白金会员.在开源领域,腾讯的贡献正逐步增长,日益成为社区活跃一员.在与社区机构互动上,腾讯广 ...

  10. tensor flow lstm 图像 一条直线_【开源计划】图像配准中变形操作(Warp)的pytorch实现...

    前言 按照开源计划的预告,这次我来分享图像配准流程中的变形操作的代码实现.首先我们先来回顾一下配准的流程,我们以这篇Unsupervised End-to-end Learning for Defor ...

最新文章

  1. 关于使用sudo命令后找不到JAVA_HOME的问题
  2. python paramiko模块中设置执行命令超时值
  3. python大神-国内某Python大神自创完整版,系统性学习Python
  4. 无边框窗体移动的方法
  5. python3学习笔记10(迭代器和生成器)
  6. 执行计划 分析一条sql语句的效率 mysql_MySQL中一条SQL语句的执行过程
  7. Android逆向笔记-使用Android Killer修改包名Android系统安装相同应用
  8. WebLogic—发布Web项目
  9. 3809. 修改数组——AcWing题库
  10. C++ vcpkg 安装
  11. 工业软件下载大全202108
  12. linux date英文日期、星期简写说明(中文对照)
  13. iPhone7 plus分辨率行不行
  14. FreeNOS--项目的README
  15. wkhtmltopdf参数详解
  16. FT4232H Android开发 2 - 建立一个FTDI设备的样板工程
  17. NC65开发使用UAP-STUDIO6.5发布WebService
  18. 麦昆mciro:bit开发板机器人小车——支持makecode图形化编程,支持基于Mind+的图形化编程及python编程
  19. Java偏向锁与轻量级锁
  20. 如何在.NET程序崩溃时自动创建Dump?

热门文章

  1. 关于ADC采样的采样频率,采样时间的问题
  2. 移动应用程序和网页应用程序_设计网站和移动应用程序的空白状态页
  3. 面向初学者的 40 多个 Python 项目——开始编写 Python 代码的简单想法
  4. 怎么在计算机里隐藏文件,怎么显示电脑隐藏文件?
  5. 徐磊8,9,10 名词性从句
  6. Metro Studio——轻松创建Metro风格图标
  7. 在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天。要求尽早聚会
  8. 华为路由器ws5200虚拟服务器,华为路由器端口映射怎么弄?华为WS5200路由添加端口映射规则设置...
  9. SaaS第一,股价暴涨,25年的金蝶迎来第二春
  10. openwrt运行n2n服务器,Windows下使用N2N搭建局域网,全球局域网(重写)