Flutter 自定义控件-仿照安卓和抖音图标绘制,看完不会的来打我

Rect rect = Rect.fromLTRB(55.0, 30.0, 255.0, 220.0);

RRect rRect = RRect.fromRectAndRadius(rect, Radius.circular(20.0));

canvas.drawRRect(rRect, paint);

paint

…style = PaintingStyle.stroke //

…strokeWidth = 60.0 / 3

…color = Colors.redAccent; //背景为纸红色

rect = Rect.fromCircle(center: Offset(size.width / 2, size.height / 2), radius: 30.0);

canvas.drawArc(rect, 0, math.pi * 3 / 2, false, paint);

canvas.drawLine(Offset(size.width / 2 + 30.0, size.height / 2), Offset(size.width / 2 + 30.0, size.height / 2 - 84.0), paint);

rect = Rect.fromCircle(center: Offset(size.width / 2 + 60.0, size.height / 2 - 80.0), radius: 30.0);

canvas.drawArc(rect, math.pi * 1, -math.pi * 0.5, false, paint);

}

@override

bool shouldRepaint(CustomPainter oldDelegate) => true;

}

class MyTrillPainter extends CustomPainter {

@override

void paint(Canvas canvas, Size size) {

var paint = Paint()

…isAntiAlias = true

…style = PaintingStyle.fill //

…strokeWidth = 1.0

…color = Colors.black; //背景为纸红色

// 设置矩形的半径和圆角的半径相等,效果如下面右图

Rect rect = Rect.fromLTRB(55.0, 30.0, 255.0, 220.0);

RRect rRect = RRect.fromRectAndRadius(rect, Radius.circular(20.0));

canvas.drawRRect(rRect, paint);

paint

…style = PaintingStyle.stroke //

…strokeWidth = 60.0 / 3

…color = Colors.redAccent; //背景为纸红色

rect = Rect.fromCircle(center: Offset(size.width / 2, size.height / 2), radius: 30.0);

canvas.drawArc(rect, 0, math.pi * 3 / 2, false, paint);

}

@override

bool shouldRepaint(CustomPainter oldDelegate) => true;

}

class MyTrillPainter extends CustomPainter {

@override

void paint(Canvas canvas, Size size) {

var paint = Paint()

…isAntiAlias = true

…style = PaintingStyle.fill //

…strokeWidth = 1.0

…color = Colors.black; //背景为纸红色

// 设置矩形的半径和圆角的半径相等,效果如下面右图

Rect rect = Rect.fromLTRB(55.0, 30.0, 255.0, 220.0);

RRect rRect = RRect.fromRectAndRadius(rect, Radius.circular(20.0));

canvas.drawRRect(rRect, paint);

paint

…style = PaintingStyle.stroke //

…strokeWidth = 60.0 / 3

…color = Colors.redAccent; //背景为纸红色

rect = Rect.fromCircle(center: Offset(size.width / 2, size.height / 2), radius: 30.0);

canvas.drawArc(rect, 0, math.pi * 3 / 2, false, paint);

canvas.drawLine(Offset(size.width / 2 + 30.0, size.height / 2), Offset(size.width / 2 + 30.0, size.height / 2 - 84.0), paint);

}

@override

bool shouldRepaint(CustomPainter oldDelegate) => true;

}

class MyTrillPainter extends CustomPainter {

@override

void paint(Canvas canvas, Size size) {

var paint = Paint()

…isAntiAlias = true

…style = PaintingStyle.fill //

…strokeWidth = 1.0

…color = Colors.black; //背景为纸红色

// 设置矩形的半径和圆角的半径相等,效果如下面右图

Rect rect = Rect.fromLTRB(55.0, 30.0, 255.0, 220.0);

RRect rRect = RRect.fromRectAndRadius(rect, Radius.circular(20.0));

canvas.drawRRect(rRect, paint);

paint

…style = PaintingStyle.stroke //

…strokeWidth = 60.0 / 3

…color = Colors.redAccent; //背景为纸红色

rect = Rect.fromCircle(center: Offset(size.width / 2 + 60.0, size.height / 2 - 80.0), radius: 30.0);

canvas.drawArc(rect, math.pi * 1, -math.pi * 0.5, false, paint);

}

@override

bool shouldRepaint(CustomPainter oldDelegate) => true;

}

3、绘制青色区域

class MyTrillPainter extends CustomPainter {

@override

void paint(Canvas canvas, Size size) {

var paint = Paint()

…isAntiAlias = true

…style = PaintingStyle.fill //

…strokeWidth = 1.0

…color = Colors.black; //背景为纸红色

// 设置矩形的半径和圆角的半径相等,效果如下面右图

Rect rect = Rect.fromLTRB(55.0, 30.0, 255.0, 220.0);

RRect rRect = RRect.fromRectAndRadius(rect, Radius.circular(20.0));

canvas.drawRRect(rRect, paint);

paint

…style = PaintingStyle.stroke //

…strokeWidth = 60.0 / 3

…color = Colors.redAccent; //背景为纸红色

rect = Rect.fromCircle(center: Offset(size.width / 2, size.height / 2), radius: 30.0);

canvas.drawArc(rect, 0, math.pi * 3 / 2, false, paint);

canvas.drawLine(Offset(size.width / 2 + 30.0, size.height / 2), Offset(size.width / 2 + 30.0, size.height / 2 - 84.0), paint);

rect = Rect.fromCircle(center: Offset(size.width / 2 + 60.0, size.height / 2 - 80.0), radius: 30.0);

canvas.drawArc(rect, math.pi * 1, -math.pi * 0.5, false, paint);

rect = Rect.fromCircle(center: Offset(size.width / 2 - 7.0, size.height / 2 - 9.0), radius: 30.0);

canvas.drawArc(rect, 0, math.pi * 3 / 2 + 0.1, false, paint…color = Colors.cyanAccent);

canvas.drawLine(Offset(size.width / 2 + 30.0 - 7.0, size.height / 2 - 9.0), Offset(size.width / 2 + 30.0 - 7.0, size.height / 2 - 80.0 - 9.0), paint);

rect = Rect.fromCircle(center: Offset(size.width / 2 + 60.0 - 7.0, size.height / 2 - 80.0 - 9.0), radius: 30.0);

canvas.drawArc(rect, math.pi * 1, -math.pi * 0.526, false, paint);

}

@override

bool shouldRepaint(CustomPainter oldDelegate) => true;

}

4、绘制白色区域

class _MyHomePageState extends State {

@override

void initState() {

// TODO: implement initState

super.initState();

}

@override

Widget build(BuildContext context) {

print(“main_build”);

return Scaffold(

backgroundColor: Colors.white,

appBar: AppBar(

title: Text(widget.title),

),

body: Center(

child: CustomPaint(

size: Size(300, 300), //指定// 画布大小

painter: MyTrillPainter(),

),

),

);

}

}

//抖音

class MyTrillPainter extends CustomPainter {

@override

void paint(Canvas canvas, Size size) {

var paint = Paint()

…isAntiAlias = true

…style = PaintingStyle.fill //

…strokeWidth = 1.0

…color = Colors.black; //背景为纸红色

// 设置矩形的半径和圆角的半径相等,效果如下面右图

Rect rect = Rect.fromLTRB(55.0, 30.0, 255.0, 220.0);

RRect rRect = RRect.fromRectAndRadius(rect, Radius.circular(20.0));

canvas.drawRRect(rRect, paint);

paint

…style = PaintingStyle.stroke //

…strokeWidth = 60.0 / 3

…color = Colors.redAccent; //背景为纸红色

rect = Rect.fromCircle(center: Offset(size.width / 2, size.height / 2), radius: 30.0);

canvas.drawArc(rect, 0, math.pi * 3 / 2, false, paint);

canvas.drawLine(Offset(size.width / 2 + 30.0, size.height / 2), Offset(size.width / 2 + 30.0, size.height / 2 - 84.0), paint);

rect = Rect.fromCircle(center: Offset(size.width / 2 + 60.0, size.height / 2 - 80.0), radius: 30.0);

canvas.drawArc(rect, math.pi * 1, -math.pi * 0.5, false, paint);

rect = Rect.fromCircle(center: Offset(size.width / 2 - 7.0, size.height / 2 - 9.0), radius: 30.0);

canvas.drawArc(rect, 0, math.pi * 3 / 2 + 0.1, false, paint…color = Colors.cyanAccent);

canvas.drawLine(Offset(size.width / 2 + 30.0 - 7.0, size.height / 2 - 9.0), Offset(size.width / 2 + 30.0 - 7.0, size.height / 2 - 80.0 - 9.0), paint);

rect = Rect.fromCircle(center: Offset(size.width / 2 + 60.0 - 7.0, size.height / 2 - 80.0 - 9.0), radius: 30.0);

canvas.drawArc(rect, math.pi * 1, -math.pi * 0.526, false, paint);

rect = Rect.fromCircle(

center: Offset(size.width / 2 - 4.0, size.height / 2 - 4.0),

radius: 30.0);

canvas.drawArc(rect, 0,

math.pi * 3 / 2,

false,

paint

…color = Colors.white

…strokeWidth = 16.0);

canvas.drawLine(

Offset(size.width / 2 + 30.0 - 4.0, size.height / 2 - 4.0),

Offset(size.width / 2 + 30.0 - 4.0, size.height / 2 - 80.0 - 4.0),

paint);

rect = Rect.fromCircle(

center:

Offset(size.width / 2 + 60.0 - 4.0, size.height / 2 - 80.0 - 4.0),

radius: 30.0);

canvas.drawArc(rect, math.pi * 1, -math.pi * 0.5, false, paint);

}

@override

bool shouldRepaint(CustomPainter oldDelegate) => true;

}

安卓图标

1、绘制灰色矩形背景

class MyAndroidPainter extends CustomPainter {

@override

void paint(Canvas canvas, Size size) {

var paint = Paint()

…isAntiAlias = true

…style = PaintingStyle.fill //

…strokeWidth = 0.0;

_drawRect(size, canvas, paint);

}

//绘制灰色矩形背景

void _drawRect(Size size, Canvas canvas, paint) {

Rect rect = Rect.fromLTRB(0.0, 0.0, size.width, size.height);

canvas.drawRect(rect, paint…color = Colors.black12);

}

@override

bool shouldRepaint(CustomPainter oldDelegate) => true;

}

2、绘制绿色圆角背景

class MyAndroidPainter extends CustomPainter {

@override

void paint(Canvas canvas, Size size) {

var paint = Paint()

…isAntiAlias = true

…style = PaintingStyle.fill //

…strokeWidth = 0.0;

//矩形圆角

double _rCircular = size.width * 7 / 30;

_drawRect(size, canvas, paint);

_drawRRect(size, canvas, paint, _rCircular);

}

//绘制灰色矩形背景

void _drawRect(Size size, Canvas canvas, paint) {

Rect rect = Rect.fromLTRB(0.0, 0.0, size.width, size.height);

canvas.drawRect(rect, paint…color = Colors.black12);

}

//绘制圆角矩形背景

void _drawRRect(Size size, Canvas canvas, paint, rCircular) {

Rect rect = Rect.fromLTRB(0.0, 0.0, size.width, size.height);

RRect rRect = RRect.fromRectAndRadius(rect, Radius.circular(rCircular));

canvas.drawRRect(rRect, paint…color = Colors.lightGreen);

}

@override

bool shouldRepaint(CustomPainter oldDelegate) => true;

}

3、绘制半圆角白色背景

@override

void paint(Canvas canvas, Size size) {

var paint = Paint()

…isAntiAlias = true

…style = PaintingStyle.fill //

…strokeWidth = 0.0;

//矩形圆角

double _rCircular = size.width * 7 / 30;

_drawRect(size, canvas, paint);

_drawRRect(size, canvas, paint, _rCircular);

//绘制中间半圆角

_drawMHalfRRect(size, canvas, paint, _rCircular / 3);

}

//绘制半圆角背景

void _drawMHalfRRect(Size size, Canvas canvas, paint, rCircular) {

double _halfRRectStartX = size.width / 3,

_halfRRectStartY = size.height / 3,

_halfRRectEndX = size.width * 2 / 3,

_halfRRectEndY = size.height * 2 / 3;

Rect rect = Rect.fromLTRB(

_halfRRectStartX, _halfRRectStartY, _halfRRectEndX, _halfRRectEndY);

RRect rRect = RRect.fromRectAndCorners(rect,

bottomLeft: Radius.circular(rCircular),

bottomRight: Radius.circular(rCircular),

topLeft: Radius.circular(0.0),

topRight: Radius.circular(0.0));

canvas.drawRRect(rRect, paint…color = Colors.white);

}

4、绘制中间半圆角-左、右边圆角矩形

@override

void paint(Canvas canvas, Size size) {

var paint = Paint()

…isAntiAlias = true

…style = PaintingStyle.fill //

…strokeWidth = 0.0;

//矩形圆角

double _rCircular = size.width * 7 / 30;

_drawRect(size, canvas, paint);

_drawRRect(size, canvas, paint, _rCircular);

//绘制中间半圆角

_drawMHalfRRect(size, canvas, paint, _rCircular / 3);

_drawMLRRect(size, canvas, paint, _rCircular / 4);

_drawMRRRect(size, canvas, paint, _rCircular / 4);

}

//绘制中间半圆角-左边圆角矩形

void _drawMLRRect(Size size, Canvas canvas, paint, rCircular) {

double _rRectStartX = size.width / 3 - 30.0,

_rRectStartY = size.height / 3,

_rRectEndX = size.width / 3 - 6.0,

_rRectEndY = size.height / 3 * 2 - 20.0;

Rect rect =

Rect.fromLTRB(_rRectStartX, _rRectStartY, _rRectEndX, _rRectEndY);

RRect rRect = RRect.fromRectAndRadius(rect, Radius.circular(rCircular));

canvas.drawRRect(rRect, paint…color = Colors.white);

}

//绘制中间半圆角-右边圆角矩形

void _drawMRRRect(Size size, Canvas canvas, paint, rCircular) {

double _rRectStartX = size.width / 3 * 2 + 6.0,

_rRectStartY = size.height / 3,

_rRectEndX = size.width / 3 * 2 + 30.0,

_rRectEndY = size.height / 3 * 2 - 20.0;

Rect rect =

Rect.fromLTRB(_rRectStartX, _rRectStartY, _rRectEndX, _rRectEndY);

RRect rRect = RRect.fromRectAndRadius(rect, Radius.circular(rCircular));

canvas.drawRRect(rRect, paint…color = Colors.white);

}

5、绘制底部2个半圆角矩形

@override

void paint(Canvas canvas, Size size) {

var paint = Paint()

…isAntiAlias = true

…style = PaintingStyle.fill //

…strokeWidth = 0.0;

//矩形圆角

double _rCircular = size.width * 7 / 30;

_drawRect(size, canvas, paint);

_drawRRect(size, canvas, paint, _rCircular);

_drawBLHalfRRect(size, canvas, paint, _rCircular / 4);

_drawBRHalfRRect(size, canvas, paint, _rCircular / 4);

}

//绘制底部左边半圆角

void _drawBLHalfRRect(Size size, Canvas canvas, paint, rCircular) {

double _rRectStartX = size.width / 3 + 20.0,

_rRectStartY = size.height / 3 * 2,

_rRectEndX = size.width / 3 + 44.0,

_rRectEndY = size.height / 3 * 2 + 40.0;

Rect rect =

Rect.fromLTRB(_rRectStartX, _rRectStartY, _rRectEndX, _rRectEndY);

RRect rRect = RRect.fromRectAndCorners(rect,

bottomLeft: Radius.circular(rCircular),

bottomRight: Radius.circular(rCircular),

topLeft: Radius.circular(0.0),

topRight: Radius.circular(0.0));

canvas.drawRRect(rRect, paint…color = Colors.white);

}

//绘制底部右边半圆角

void _drawBRHalfRRect(Size size, Canvas canvas, paint, rCircular) {

double _rRectStartX = size.width / 3 + 56.0,

_rRectStartY = size.height / 3 * 2,

_rRectEndX = size.width / 3 * 2 - 20.0,

_rRectEndY = size.height / 3 * 2 + 40.0;

Rect rect =

Rect.fromLTRB(_rRectStartX, _rRectStartY, _rRectEndX, _rRectEndY);

RRect rRect = RRect.fromRectAndCorners(rect,

bottomLeft: Radius.circular(rCircular),

bottomRight: Radius.circular(rCircular),

topLeft: Radius.circular(0.0),

topRight: Radius.circular(0.0));

canvas.drawRRect(rRect, paint…color = Colors.white);

}

6、绘制顶部弧形区域

//绘制顶部半圆

void _drawTopArc(Size size, Canvas canvas, paint) {

Rect rect = Rect.fromLTRB(size.width / 3, size.height / 6,

size.width * 2 / 3, size.height / 6 + 90.0);

canvas.drawArc(rect, 3.14, 3.14, true, paint…color = Colors.white);

}

7、绘制顶部弧形内部2个小圆点

//绘制顶部半圆-眼睛

void _drawTopLeftEyes(Size size, Canvas canvas, paint) {

Offset offset = Offset(size.width / 3 + 30.0, size.height / 6 + 20.0);

canvas.drawCircle(offset, 6.0, paint…color = Colors.lightGreen);

}

//绘制顶部半圆-眼睛
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

Android高级架构师

由于篇幅问题,我呢也将自己当前所在技术领域的各项知识点、工具、框架等汇总成一份技术路线图,还有一些架构进阶视频、全套学习PDF文件、面试文档、源码笔记。

  • 330页PDF Android学习核心笔记(内含上面8大板块)

  • Android学习的系统对应视频

  • Android进阶的系统对应学习资料

  • Android BAT部分大厂面试题(有解析)

好了,以上便是今天的分享,希望为各位朋友后续的学习提供方便。觉得内容不错,也欢迎多多分享给身边的朋友哈。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

f-1712510704970)]

[外链图片转存中…(img-JtsPwfF1-1712510704970)]

[外链图片转存中…(img-1QFl7Jmf-1712510704971)]

[外链图片转存中…(img-R0Q98Ynz-1712510704971)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

Android高级架构师

由于篇幅问题,我呢也将自己当前所在技术领域的各项知识点、工具、框架等汇总成一份技术路线图,还有一些架构进阶视频、全套学习PDF文件、面试文档、源码笔记。

  • 330页PDF Android学习核心笔记(内含上面8大板块)

[外链图片转存中…(img-Mko3HVec-1712510704972)]

[外链图片转存中…(img-SAheEDBR-1712510704972)]

  • Android学习的系统对应视频

  • Android进阶的系统对应学习资料

[外链图片转存中…(img-G7zxOwWi-1712510704972)]

  • Android BAT部分大厂面试题(有解析)

[外链图片转存中…(img-KdLTU5jU-1712510704972)]

好了,以上便是今天的分享,希望为各位朋友后续的学习提供方便。觉得内容不错,也欢迎多多分享给身边的朋友哈。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值