Flutter开发之斜角标签
由于公司的项目需要用到一个斜角的标签,效果如下:
我在GitHub和pub.dev上找了很多都没找到,于是结合了一下网上别人的思路和自己的想法决定自己写一个来实现,至于圆角我是打算用Flutter绘制进阶——贝塞尔曲线 - 掘金来画圆角。class SlantedTagView extends StatefulWidget { final Size size; final String labelText; final TextStyle? textStyle; final Color labelColor; final Color backgroundColor; final bool useAngle; final int labelAlignment; const SlantedTagView(this.size, {super.key, this.labelColor = Colors.black, this.labelText = "movie", this.useAngle = true, this.backgroundColor = Colors.transparent, this.labelAlignment = LabelAlignment.leftTop, this.textStyle}); @override State createState() { return SlantedTagViewState(); } } class SlantedTagViewState extends State { static const double pi = 3.1415926; late double textAngle; late Alignment textAlignment; late Offset offset; @override Widget build(BuildContext context) { var offsetX = widget.size.width > widget.size.height ? widget.size.height / 3 : widget.size.width / 3; switch (widget.labelAlignment) { case LabelAlignment.leftTop: offset = Offset(offsetX, 0); textAlignment = Alignment.topLeft; textAngle = -pi / 4; break; case LabelAlignment.rightTop: offset = Offset(-offsetX, 0); textAlignment = Alignment.topRight; textAngle = pi / 4; break; case LabelAlignment.leftBottom: offset = Offset(offsetX, 0); textAlignment = Alignment.bottomLeft; textAngle = pi / 4; break; case LabelAlignment.rightBottom: offset = Offset(-offsetX, 0); textAlignment = Alignment.bottomRight; textAngle = -pi / 4; break; } return Container( color: widget.backgroundColor, width: widget.size.width, height: widget.size.height, child: CustomPaint( size: widget.size, painter: LabelViewPainter( widget.labelColor, widget.labelAlignment, widget.useAngle), child: Align( alignment: textAlignment, child: Transform.rotate( angle: textAngle, origin: offset, child: Text( widget.labelText, style: widget.textStyle ?? const TextStyle(color: Colors.white), textAlign: TextAlign.center, ), )), ), ); } } class LabelAlignment { int labelAlignment; LabelAlignment(this.labelAlignment); static const leftTop = 0; static const leftBottom = 1; static const rightTop = 2; static const rightBottom = 3; }
使用自定义paint来绘画: class LabelViewPainter extends CustomPainter { Color labelColor; int labelAlignment; bool useAngle; late Paint _paint; LabelViewPainter(this.labelColor, this.labelAlignment, this.useAngle) { _paint = Paint() ..color = labelColor ..strokeCap = StrokeCap.square ..isAntiAlias = true ..style = PaintingStyle.fill ..strokeWidth = 10.0; } @override void paint(Canvas canvas, Size size) { var drawSize = size.height > size.width ? size.width / 2 : size.height / 2; Path path = Path(); switch (labelAlignment) { case LabelAlignment.leftTop: if (!useAngle) { path.moveTo(0, drawSize / 2.2); path.quadraticBezierTo(0, 0, drawSize / 2.2, 0); } path.lineTo(drawSize, 0); path.lineTo(0, drawSize); break; // 下面的左下角、右上角、右下角和上面的类似的,使用moveTo移动画笔 // 使用lineTo画线就可以了 case LabelAlignment.leftBottom: break; case LabelAlignment.rightTop: break; case LabelAlignment.rightBottom: break; } path.close(); canvas.drawPath(path, _paint); } @override bool shouldRepaint(CustomPainter oldDelegate) { return true; } }
然后就是使用:class Test extends StatelessWidget { const Test({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text("SlantedEdge"), ), body: Container( width: 200.w, height: 200.w, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(40.w)), child: SlantedTagView( Size(100.w, 100.w), useAngle: false, labelText: "Available", textStyle: TextStyle(color: Colors.white, fontSize: 12.sp), ), ), ); } }
这个就是最终的效果图:
上海迪士尼2天游玩攻略,拍好烟花秀发朋友圈秀上海迪士尼和香港迪士尼有以下几个区别规模上海迪士尼乐园是全球最大的迪士尼主题乐园之一,而香港迪士尼乐园则相对较小。地理位置上海迪士尼乐园位于上海市郊区,距离市中心较远,而香港迪士尼
老照片120年前的上海,外滩苏州河南京路,和现在完全不一样人们经常说,一座城市因为有了历史,才显得厚重。历史,是一座城市的记忆,文化是一座城市的命脉。被誉为东方巴黎的上海,钟灵毓秀历史悠久,一百多年前就令世界瞩目。清朝末年,英国摄影师查尔
河小青来助力!珠海香湾街道大力宣传河长制为进一步增进群众对河长制的了解,提升爱河护河责任意识,近日,珠海市香湾街道在海天公园开展河长制宣传活动。活动通过发放河长制宣传品宣传册等方式,大力宣传河长制的目标任务河小青志愿者申
三大运营商的三阴灌肠昨日的移动电信联通纷纷杀出惊天大阴线,中国移动跌9。03,中国电信9。93,中国联通9。59,电信盘中一度封死跌停,移动破百的时候,一度认为已经到头了,后面又反复了几天,甚至冲到了
姚安花红柳绿春意浓桃花盛开产业丰惊蛰节令后,随着天气逐渐回暖,楚雄彝族自治州姚安县太平镇老街村的500多亩桃花进入了盛花期。充足的光照,适宜的气候,加上精心管理,这里的桃林树形婀娜多姿,花开锦簇艳丽。姚安县太平镇
情侣穷游庆祝婚礼,当事人准备在99个地方搭建囍字场景合影近日,甘肃一对新婚夫妻旅游结婚的视频火了。视频中,这对新婚夫妻正在西部城市流浪旅行,每到一地便搭建囍字场景并合影留念。不少网友纷纷留言,表示羡慕,在山河日月见证下的爱情真浪漫。当事
身家千万旅游公司老板被骗缅甸,几经转卖瘦40斤斗智斗勇死里逃生幸卫林是贵州人,离异单身,有自己的旅游公司,并在全国拥有142家门店,身价上千万。能拥有这么多门店这么多财富的人,靠的一定不是运气而是实力,可就是这么一个有勇有谋的人竟然也被骗到了
大唐第一名将李靖,晚年受到李世民的猜忌,战战兢兢唐朝名将如云,能征善战者有很多,比如李靖苏定方薛仁贵王忠嗣郭子仪李光弼等等,在这么多的名将当中,论军事才能和功绩谁可以排在第一位呢?那必然是李靖。李靖的名气不如卫青和霍去病,但是他
导游提醒游客理性购物,如何让这股清流淌得更远正观评论员王航如果不能建立合理的导游薪资制度,无法依法铲除不合理低价团的生存空间,劝游客理性购物的行业基本操作就依然会是稀缺品旅游,以游为主,尽量多走一些地方,少买一点东西。记住,
延庆白河堡水库迎来数十只苍鹭筑巢孵卵新京报讯(记者曹晶瑞)早春三月,候鸟北归,3月21日,新京报记者从延庆区了解到,连日来,延庆区白河堡水库内的悬崖峭壁上,迎来了数十只苍鹭筑巢孵卵栖息觅食,为初春的白河增添了无限生机
记录2迪拜,有钱人的天堂(1)2006年2008年5。12地震前,我在阿联酋迪拜工作和生活了两年,给我的感觉就是,自己的荷包太小,现金太少。2007年的帆船酒店2007年的帆船酒店内景迪拜,一个有钱人的天堂!当