Flutter 自定义控件-仿照安卓和抖音图标绘制

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;

}

![](https://img-blog.csdnimg.cn/20200822160340303.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow

_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM0OTE4Mjk=,size_16,color_FFFFFF,t_70)

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) {

最后

在这里小编整理了一份Android大厂常见面试题,和一些Android架构视频解析,都已整理成文档,全部都已打包好了,希望能够对大家有所帮助,在面试中能顺利通过。

image

image

喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗

/ 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) {

最后

在这里小编整理了一份Android大厂常见面试题,和一些Android架构视频解析,都已整理成文档,全部都已打包好了,希望能够对大家有所帮助,在面试中能顺利通过。

[外链图片转存中…(img-eDfY3JoN-1716043188108)]

[外链图片转存中…(img-SQC61eNW-1716043188109)]

喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值