<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
由於工作中專案需求,需要將H5轉換為Flutter程式碼。
其中的斑馬紋背景需要根據介面返回的顏色來渲染,所以不能只是圖片形式,無法通過decoration屬性設定圖片背景板。
樓主這邊想到的方法就是通過 實現一個canvas繪製斑馬紋類。使用Stack佈局,將斑馬紋放在下方作為背景板,需要展示的內容在上方。實現 “斑馬紋”背景(需要變換顏色)
文章主要分為 效果圖、實現思維、程式碼、計算過程解釋。希望對大家有所幫助
使用CustomPaint(size: Size(width, height), painter: 畫筆)
CustomPaint( size: Size(widget.width, widget.height), painter: 畫筆, )
繼承 CustomPainter類,實現paint(Canvas canvas, Size size)方法,根據 寬度、高度、畫筆寬度、間距 計算出各個點位。使用canvas. drawLine方法 繪製出斑馬紋。
@override void paint(Canvas canvas, Size size) { … canvas. drawLine(); }
2.82 = 2倍根號2
1.41 = 根號二
由於畫筆繪製的是直角的,所以作為背景板會超出,需要裁剪掉四個角。使用
ClipRRect( borderRadius: BorderRadius.all(Radius.circular(10)), child: xxx )
使用Stack佈局,實現斑馬紋在下方作為背景板,需要展示的內容在上方
Stack( children: [ buildZebraBack(…), 需要展示的內容 ] )
Stack( children: [ Positioned( child: ZebraStripesBack( width: 335, height: 44, lineWidth: 10, spacing: 10, borderRaduis: 10, lineColor: Colors.blue), top: 0, left: 0, ), Container( width: 335, height: 44, alignment: Alignment.center, padding: EdgeInsets.only( top: 10, left: 12, bottom: 10, right: 12), child: Text( "英語", style: TextStyle( color: Color(0xFFFFFFFF), fontSize: 14.sp, fontWeight: FontWeight.w500), ) ) ] )
import 'dart:math'; import 'package:flutter/material.dart'; // 斑馬紋具體實現類 class ZebraStripesBack extends StatefulWidget { ZebraStripesBack({ this.width: 0, this.height: 0, this.spacing: 4, this.lineWidth: 4, this.lineColor: Colors.transparent, this.borderRaduis: 0, }); final double width; // 容器寬度 final double height; // 容器高度 final double lineWidth; // 斑馬紋寬度 final double spacing; // 間距 final double borderRaduis; // 容器圓角 final Color lineColor; // 斑馬紋顏色 @override State<StatefulWidget> createState() => _ZebraStripesBackState(); } class _ZebraStripesBackState extends State<ZebraStripesBack> { @override void initState() { super.initState(); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { return ClipRRect( borderRadius: BorderRadius.all(Radius.circular(widget.borderRaduis)), child: CustomPaint( size: Size(widget.width, widget.height), painter: _ZebraStripesBackPainter( maxWidth: widget.width, maxHeight: widget.height, spacing: widget.spacing, lineWidth: widget.lineWidth, lineColor: widget.lineColor, borderRaduis: widget.borderRaduis, ), )); } } class _ZebraStripesBackPainter extends CustomPainter { _ZebraStripesBackPainter({ this.maxWidth: 0, this.maxHeight: 0, this.spacing: 4, this.lineWidth: 4, this.lineColor: Colors.black12, this.borderRaduis: 0, }); final double maxWidth; final double maxHeight; final double spacing; final double lineWidth; final Color lineColor; final double borderRaduis; @override void paint(Canvas canvas, Size size) { var paint = Paint() ..isAntiAlias = true ..style = PaintingStyle.fill ..color = lineColor ..strokeWidth = lineWidth; int number = 0; // 個數 int fillNumber = 0; // 填充個數 double lineAndSpace = lineWidth *1.41 + spacing; // 單個條紋寬 + 間距寬 if (lineWidth > 0) { number = (maxWidth / lineAndSpace).ceil(); fillNumber = (maxHeight / lineAndSpace).ceil(); // 填充個數 } double deviation = lineWidth / 2.82; // x y軸偏移量 = width / 2倍根號2 for (int i = -fillNumber; i < number; i++) { var left = lineAndSpace * i - deviation; double dx = left; double dy = -deviation; double dx1 = left + maxHeight; double dy1 = maxHeight + deviation; canvas.drawLine( Offset(dx, dy), Offset(dx1, dy1), paint, ); } } @override bool shouldRepaint(CustomPainter oldDelegate) => true; }
偏移量計算過程
填充個數計算過程
為什麼畫筆寬度需要乘 根號二?
缺少-填充
缺少-偏移量
以上就是Android Flutter實現"斑馬紋"背景的範例程式碼的詳細內容,更多關於Flutte斑馬紋背景的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45