From 2ea12bce093aff79297781058a58af00514450ea Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 16 Feb 2022 21:18:35 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=98=E5=88=B6=E5=86=B0=E5=A2=A9=E5=A2=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/images/logo1.webp | Bin 0 -> 15174 bytes lib/painter_system/anim/dundun_path.dart | 265 +++++++++++++ lib/painter_system/fun/dundun_view.dart | 453 +++++++++++++++++++++++ lib/painter_system/gallery_factory.dart | 13 + 4 files changed, 731 insertions(+) create mode 100644 assets/images/logo1.webp create mode 100644 lib/painter_system/anim/dundun_path.dart create mode 100644 lib/painter_system/fun/dundun_view.dart diff --git a/assets/images/logo1.webp b/assets/images/logo1.webp new file mode 100644 index 0000000000000000000000000000000000000000..4e0dfcb61eb97a19a8cd73b10b3a647d594ba2e2 GIT binary patch literal 15174 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 _DunDunPathPageState(); +} + +class _DunDunPathPageState extends Statewith SingleTickerProviderStateMixin { + ui.Image? logo2Image; + + late AnimationController _controller; + + + @override + void initState() { + super.initState(); + loadImage(); + _controller = AnimationController( + duration: const Duration(seconds: 3), + vsync: this, + )..forward(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + void loadImage() async { + ByteData data2 = await rootBundle.load('assets/images/logo1.webp'); + logo2Image = await decodeImageFromList(data2.buffer.asUint8List()); + if (mounted) setState(() {}); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GestureDetector( + onTap: (){ + _controller.reset(); + _controller.forward(); + }, + child: CustomPaint( + painter: DunDunPainter(logo2Image,_controller), + size: const Size(200, 200), + ), + ), + ), + ); + } +} + +class DunDunPainter extends CustomPainter { + + final ui.Image? logo2Image; + final Animation repaint; + + DunDunPainter(this.logo2Image,this.repaint):super(repaint: repaint); + + final Paint helpPaint = Paint() + ..style = PaintingStyle.stroke + ..color = Colors.blue; + final Paint pathPaint = Paint()..style = PaintingStyle.stroke; + + @override + void paint(Canvas canvas, Size size) { + if (logo2Image!=null) { + Rect src2 = Rect.fromLTWH( + 0, 0, logo2Image!.width.toDouble(), logo2Image!.height.toDouble()); + Rect dst2 = Rect.fromLTWH(85, 132, 899/27, 1066/27); + canvas.drawImageRect(logo2Image!, src2, dst2, Paint()); + } + + Path dundunPath = Path(); + canvas.translate(30, 80); + helpPaint.color = Colors.red; + + Path bodyPath = buildBodyPath(); + Path leftHandPath = buildLeftHandPath(); + Path rightHandPath = buildRightHandPath(); + + canvas.save(); + Path eyePath = Path(); + Matrix4 m = Matrix4.translationValues(46,-12, 0).multiplied( + Matrix4.rotationZ(45 / 180 * pi) + ); + eyePath + .addOval(Rect.fromCenter(center: Offset(0, 0), width: 32, height: 49)); + eyePath = eyePath.transform(m.storage); + canvas.restore(); + + Path leftEyePath = Path(); + leftEyePath.addOval(Rect.fromCenter(center: Offset(50, -13), width: 18, height: 18)); + + Path leftEyePath2 = Path(); + leftEyePath2.addOval(Rect.fromCenter(center: Offset(50, -13), width: 7, height: 7)); + + Path leftEyePath3 = Path(); + leftEyePath3.addOval(Rect.fromCenter(center: Offset(51, -19), width: 4, height: 4)); + + + Path rightEyePath = Path(); + rightEyePath.addOval(Rect.fromCenter(center: Offset(98, -14), width: 17, height: 17)); + + Path rightEyePath2 = Path(); + rightEyePath2.addOval(Rect.fromCenter(center: Offset(98, -14), width: 7, height: 7)); + + Path rightEyePath3 = Path(); + rightEyePath3.addOval(Rect.fromCenter(center: Offset(98, -19), width: 4, height: 4)); + + Path nosePath = Path(); + nosePath.moveTo(79, -0,); + nosePath.relativeLineTo(14, -14,); + nosePath.relativeLineTo(-28, 0,); + nosePath.close(); + Path clipCirclePath =Path(); + clipCirclePath.addOval(Rect.fromCenter(center: Offset(79, -10,), width: 14, height: 14)); + nosePath = Path.combine(PathOperation.intersect, nosePath, clipCirclePath); + Path smaliPath = Path(); + smaliPath.moveTo(65, -0,); + + smaliPath.quadraticBezierTo(78, 15, 90, 0); + smaliPath.quadraticBezierTo(78, 6, 65, 0,); + + Path colorfulPath = Path(); + colorfulPath.addOval(Rect.fromCenter(center: Offset(72, -5,), width: 120, height: 110)); + colorfulPath.addOval(Rect.fromCenter(center: Offset(72, -5,), width: 110, height: 100)); + colorfulPath.addOval(Rect.fromCenter(center: Offset(72, -5,), width: 115, height: 110)); + colorfulPath.addOval(Rect.fromCenter(center: Offset(72, -5,), width: 120, height: 105)); + colorfulPath.addOval(Rect.fromCenter(center: Offset(72, -5,), width: 115, height: 105)); + + canvas.save(); + Path eyePath2 = Path(); + Matrix4 m2 = Matrix4.translationValues(105,-12,0).multiplied( + Matrix4.rotationZ(-40 / 180 * pi) + ); + eyePath2 + .addOval(Rect.fromCenter(center: Offset(0, 0), width: 29, height: 48)); + eyePath2 = eyePath2.transform(m2.storage); + canvas.restore(); + Path leftFootPath = buildFootPath(); + Path erPath = buildErPath(); + + //爱心 + List arr = []; + int len = 50; + double a =1; + for (int i = 0; i < len; i++) { + double step = (i / len) * (pi * 2); //递增的θ + Offset offset = Offset( + a * (11 * pow(sin(step), 3)).toDouble() , + -a * + (9 * cos(step) - + 5 * cos(2 * step) - + 2 * cos(3 * step) - + cos(4 * step)), + ); + arr.add(offset); + } + Path starPath = Path(); + for (int i = 0; i < len; i++) { + starPath.lineTo(arr[i].dx, arr[i].dy); + } + starPath = starPath.shift(Offset(152,-20)); + + dundunPath.addPath(bodyPath, Offset.zero); + dundunPath.addPath(leftHandPath, Offset.zero); + dundunPath.addPath(rightHandPath, Offset.zero); + dundunPath.addPath(leftFootPath, Offset.zero); + dundunPath.addPath(erPath, Offset.zero); + dundunPath.addPath(eyePath, Offset.zero); + dundunPath.addPath(eyePath2, Offset.zero); + dundunPath.addPath(leftEyePath, Offset.zero); + dundunPath.addPath(leftEyePath2, Offset.zero); + dundunPath.addPath(leftEyePath3, Offset.zero); + dundunPath.addPath(rightEyePath, Offset.zero); + dundunPath.addPath(rightEyePath2, Offset.zero); + dundunPath.addPath(rightEyePath3, Offset.zero); + dundunPath.addPath(nosePath, Offset.zero); + dundunPath.addPath(starPath, Offset.zero); + dundunPath.addPath(colorfulPath, Offset.zero); + dundunPath.addPath(smaliPath, Offset.zero); + + pathPaint + ..strokeWidth = 1 + ..color = Colors.cyanAccent; + PathMetrics pms = dundunPath.computeMetrics(); + pms.forEach((pm) { + canvas.drawPath(pm.extractPath(0, pm.length * repaint.value), pathPaint); + }); + } + + Path buildBodyPath() { + Path path = Path(); + path.quadraticBezierTo(10, -75, 75, -75); + path.quadraticBezierTo(135, -70, 138, 0); + path.quadraticBezierTo(130, 90, 65, 98); + path.quadraticBezierTo(-5, 85, 0, 0); + return path; + } + + Path buildLeftHandPath() { + Path path = Path(); + path.quadraticBezierTo( + -17, + 14, + -28, + 40, + ); + path.quadraticBezierTo(-32, 58, -15, 62); + path.quadraticBezierTo(10, 60, 0, 0); + return path; + } + + Path buildRightHandPath() { + Path path = Path(); + path.moveTo(135, -20); + path.quadraticBezierTo(140, -48, 165, -35); + path.quadraticBezierTo(180, -17, 135, 22); + path.quadraticBezierTo(125, 17, 135, -20); + return path; + } + + Path buildFootPath() { + Path path = Path(); + path.moveTo(18, 78); + path.quadraticBezierTo(18, 100, 22, 115); + path.quadraticBezierTo(60, 125, 55, 98); + path.quadraticBezierTo(35, 80, 18, 78); + + Path right = path + .transform(Matrix4.diagonal3Values(-1, 1, 1).storage) + .shift(const Offset(128, 0)); + + return Path.combine(PathOperation.union, path, right); + } + + Path buildErPath() { + Path path = Path(); + path.moveTo(13, -40); + path.quadraticBezierTo(8, -95, 40, -68); + path.quadraticBezierTo(40, -55, 13, -40); + + Path right = path + .transform(Matrix4.diagonal3Values(-1, 1, 1).storage) + .shift(const Offset(138, -5)); + + return Path.combine(PathOperation.union, path, right); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} diff --git a/lib/painter_system/fun/dundun_view.dart b/lib/painter_system/fun/dundun_view.dart new file mode 100644 index 0000000..ead4687 --- /dev/null +++ b/lib/painter_system/fun/dundun_view.dart @@ -0,0 +1,453 @@ +import 'dart:math'; +import 'dart:typed_data'; +import 'dart:ui' as ui; +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class DunDunView extends StatefulWidget { + const DunDunView({Key? key}) : super(key: key); + + @override + _DunDunViewState createState() => _DunDunViewState(); +} + +class _DunDunViewState extends State { + ui.Image? image; + + @override + void initState() { + super.initState(); + loadImage(); + } + + void loadImage() async { + ByteData data2 = await rootBundle.load('assets/images/logo1.png'); + image = await decodeImageFromList(data2.buffer.asUint8List()); + if (mounted) setState(() {}); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: CustomPaint( + painter: DunDunPainter( + image, + ), + size: const Size(200, 200), + ), + ), + ); + } +} + +class DunDunPainter extends CustomPainter { + final ui.Image? image; + + DunDunPainter(this.image); + + final Paint helpPaint = Paint() + ..style = PaintingStyle.stroke + ..color = Colors.blue; + final Paint pathPaint = Paint()..style = PaintingStyle.stroke; + + @override + void paint(Canvas canvas, Size size) { + + canvas.translate(30, 80); + helpPaint.color = Colors.red; + + pathPaint.style = PaintingStyle.fill; + + Path leftHandPath = buildLeftHandPath(); + pathPaint.color = Colors.black; + canvas.drawPath(leftHandPath, pathPaint); + + Path erPath = buildErPath(); + canvas.drawPath(erPath, pathPaint); + + Path rightHandPath = buildRightHandPath(); + pathPaint.color = Colors.black; + canvas.drawPath(rightHandPath, pathPaint); + + pathPaint.style = PaintingStyle.fill; + pathPaint.color = Color(0xffF1F4F7); + + Path bodyPath = buildBodyPath(); + canvas.drawPath(bodyPath, pathPaint); + + canvas.save(); + Path eyePath = Path(); + Matrix4 m = Matrix4.translationValues(46, -12, 0) + .multiplied(Matrix4.rotationZ(45 / 180 * pi)); + eyePath + .addOval(Rect.fromCenter(center: Offset(0, 0), width: 32, height: 49)); + eyePath = eyePath.transform(m.storage); + pathPaint.color = Colors.black; + canvas.drawPath(eyePath, pathPaint); + canvas.restore(); + + Path nosePath = Path(); + nosePath.moveTo(79, -0); + nosePath.relativeLineTo(12, -12); + nosePath.relativeLineTo(-24, 0); + nosePath.close(); + Path clipCirclePath = Path(); + clipCirclePath.addOval( + Rect.fromCenter(center: Offset(79, -10), width: 12, height: 12)); + + nosePath = Path.combine(PathOperation.intersect, nosePath, clipCirclePath); + pathPaint.style = PaintingStyle.fill; + pathPaint.color = Colors.black; + canvas.drawPath(nosePath, pathPaint); + + Path smaliPath = Path(); + smaliPath.moveTo(65, -0); + + smaliPath.quadraticBezierTo(78, 15, 90, 0); + smaliPath.quadraticBezierTo(78, 6, 65, 0); + pathPaint.color = Colors.red; + canvas.drawPath(smaliPath, pathPaint); + canvas.drawPath( + smaliPath, + pathPaint + ..style = PaintingStyle.stroke + ..strokeWidth = 1 + ..color = Colors.black); + + Paint colorfulPaint = Paint()..style = PaintingStyle.stroke; + List colors = [ + Color(0xFFF60C0C), + Color(0xFFF3B913), + Color(0xFFE7F716), + Color(0xFF3DF30B), + Color(0xFF0DF6EF), + Color(0xFF0829FB), + Color(0xFFB709F4), + ]; + final List pos = + List.generate(colors.length, (index) => index / colors.length); + colorfulPaint.shader = ui.Gradient.sweep( + Offset(60, -5), colors, pos, TileMode.clamp, 0, 2 * pi); + colorfulPaint.maskFilter = MaskFilter.blur(BlurStyle.solid, 2); + + Path colorfulPath = Path(); + colorfulPath.addOval( + Rect.fromCenter(center: Offset(72, -5), width: 120, height: 110)); + colorfulPath.addOval( + Rect.fromCenter(center: Offset(72, -5), width: 110, height: 100)); + colorfulPath.addOval( + Rect.fromCenter(center: Offset(72, -5), width: 115, height: 110)); + colorfulPath.addOval( + Rect.fromCenter(center: Offset(72, -5), width: 120, height: 105)); + colorfulPath.addOval( + Rect.fromCenter(center: Offset(72, -5), width: 115, height: 105)); + colorfulPath.addOval( + Rect.fromCenter(center: Offset(72, -5), width: 117, height: 103)); + canvas.drawPath(colorfulPath, colorfulPaint); + + canvas.save(); + Path eyePath2 = Path(); + Matrix4 m2 = Matrix4.translationValues(105, -12, 0) + .multiplied(Matrix4.rotationZ(-40 / 180 * pi)); + eyePath2 + .addOval(Rect.fromCenter(center: Offset(0, 0), width: 29, height: 48)); + eyePath2 = eyePath2.transform(m2.storage); + pathPaint.style = PaintingStyle.fill; + pathPaint.color = Colors.black; + canvas.drawPath(eyePath2, pathPaint); + + canvas.restore(); + Path rightEyePath = Path(); + rightEyePath.addOval( + Rect.fromCenter(center: Offset(98, -14), width: 17, height: 17)); + pathPaint.style = PaintingStyle.stroke; + pathPaint.color = Colors.white; + canvas.drawPath(rightEyePath, pathPaint..strokeWidth = 2); + + Path rightEyePath2 = Path(); + rightEyePath2 + .addOval(Rect.fromCenter(center: Offset(98, -14), width: 7, height: 7)); + pathPaint.style = PaintingStyle.fill; + pathPaint.color = Colors.white.withOpacity(0.4); + canvas.drawPath(rightEyePath2, pathPaint); + + Path rightEyePath3 = Path(); + rightEyePath3 + .addOval(Rect.fromCenter(center: Offset(98, -19), width: 4, height: 4)); + pathPaint.style = PaintingStyle.fill; + pathPaint.color = Colors.white; + canvas.drawPath(rightEyePath3, pathPaint); + + Path leftEyePath = Path(); + leftEyePath.addOval( + Rect.fromCenter(center: Offset(50, -13), width: 18, height: 18)); + pathPaint.style = PaintingStyle.stroke; + pathPaint.color = Colors.white; + canvas.drawPath(leftEyePath, pathPaint..strokeWidth = 2); + + Path leftEyePath2 = Path(); + leftEyePath2 + .addOval(Rect.fromCenter(center: Offset(50, -13), width: 7, height: 7)); + pathPaint.style = PaintingStyle.fill; + pathPaint.color = Colors.white.withOpacity(0.4); + canvas.drawPath(leftEyePath2, pathPaint); + + Path leftEyePath3 = Path(); + leftEyePath3 + .addOval(Rect.fromCenter(center: Offset(51, -19), width: 4, height: 4)); + pathPaint.style = PaintingStyle.fill; + pathPaint.color = Colors.white; + canvas.drawPath(leftEyePath3, pathPaint); + + Path leftFootPath = buildFootPath(); + pathPaint.style = PaintingStyle.fill; + pathPaint.color = Colors.black; + canvas.drawPath(leftFootPath, pathPaint); + + //爱心 + List arr = []; + int len = 50; + double a = 1; + for (int i = 0; i < len; i++) { + double step = (i / len) * (pi * 2); //递增的θ + Offset offset = Offset( + a * (11 * pow(sin(step), 3)).toDouble(), + -a * + (9 * cos(step) - + 5 * cos(2 * step) - + 2 * cos(3 * step) - + cos(4 * step)), + ); + arr.add(offset); + } + + Path starPath = Path(); + for (int i = 0; i < len; i++) { + starPath.lineTo(arr[i].dx, arr[i].dy); + } + pathPaint..color = Colors.red; + starPath = starPath.shift(Offset(152, -20)); + canvas.drawPath(starPath, pathPaint); + + if (image != null) { + Rect src2 = Rect.fromLTWH( + 0, 0, image!.width.toDouble(), image!.height.toDouble()); + Rect dst2 = Rect.fromLTWH(50, 55, 899 / 27, 1066 / 27); + + canvas.drawImageRect(image!, src2, dst2, Paint()); + } + + Path dundunOutLine = Path.combine( + PathOperation.union, + Path.combine( + PathOperation.union, + Path.combine( + PathOperation.union, + Path.combine(PathOperation.union, bodyPath, leftFootPath), + rightHandPath), + leftHandPath), + erPath); + Paint outLinePainter = Paint() + ..style = PaintingStyle.stroke + ..color = Colors.black + ..strokeWidth = 3; + outLinePainter.maskFilter = MaskFilter.blur(BlurStyle.outer, 4); + canvas.drawPath(dundunOutLine, outLinePainter); + + Path p2 = Path() + ..addOval(Rect.fromCenter( + center: Offset( + 72, + -5, + ), + width: 126, + height: 116)); + + outLinePainter.maskFilter = MaskFilter.blur(BlurStyle.outer, 4); + canvas.drawPath( + p2, + outLinePainter + ..color = Colors.black + ..strokeWidth = 2); + } + + Path buildBodyPath() { + Path path = Path(); + path.quadraticBezierTo(10, -75, 75, -75); + path.quadraticBezierTo(135, -70, 138, 0); + path.quadraticBezierTo(130, 90, 65, 98); + path.quadraticBezierTo(-5, 85, 0, 0); + return path; + } + + Path buildLeftHandPath() { + Path path = Path(); + path.quadraticBezierTo( + -17, + 14, + -28, + 40, + ); + path.quadraticBezierTo(-32, 58, -15, 62); + path.quadraticBezierTo(10, 60, 0, 0); + return path; + } + + Path buildRightHandPath() { + Path path = Path(); + path.moveTo(135, -20); + path.quadraticBezierTo(140, -48, 165, -35); + path.quadraticBezierTo(180, -17, 135, 22); + path.quadraticBezierTo(125, 17, 135, -20); + return path; + } + + Path buildFootPath() { + Path path = Path(); + path.moveTo(18, 78); + path.quadraticBezierTo(18, 100, 22, 115); + path.quadraticBezierTo(60, 125, 55, 98); + path.quadraticBezierTo(35, 80, 18, 78); + + Path right = path + .transform(Matrix4.diagonal3Values(-1, 1, 1).storage) + .shift(const Offset(128, 0)); + + return Path.combine(PathOperation.union, path, right); + } + + Path buildErPath() { + Path path = Path(); + path.moveTo(13, -40); + path.quadraticBezierTo(8, -95, 40, -68); + path.quadraticBezierTo(40, -55, 13, -40); + + Path right = path + .transform(Matrix4.diagonal3Values(-1, 1, 1).storage) + .shift(const Offset(138, -5)); + + return Path.combine(PathOperation.union, path, right); + } + + void paintBodyPoints(ui.Canvas canvas) { + helpPaint.strokeWidth = 4; + canvas.drawPoints( + ui.PointMode.points, + [ + Offset(10, -68), + Offset(75, -75), + + Offset(135, -70), + Offset(138, 0), + + Offset(130, 90), + Offset(65, 98), + + // Offset(55,98), + // Offset(18,78), + + Offset(-5, 85), + Offset(0, 0), + ], + helpPaint); + } + + void paintErPoints(ui.Canvas canvas) { + helpPaint.strokeWidth = 4; + canvas.drawPoints( + ui.PointMode.points, + [ + Offset( + 13, + -40, + ), + Offset( + 40, + -68, + ), + Offset(40, -55), + Offset( + 8, + -95, + ), + // Offset(18, 78), + // Offset(22, 115), + // Offset(55, 98), + // Offset( + // 40, + // 80, + // ), + ], + helpPaint); + } + + void paintHandsHelpPoints(ui.Canvas canvas) { + helpPaint.strokeWidth = 4; + canvas.drawPoints( + ui.PointMode.points, + [ + Offset(-0, 0), + Offset(-17, 14), + Offset(-28, 40), + Offset(-32, 58), + Offset(-15, 62), + Offset( + 8, + 60, + ), + Offset(-0, 0), + ], + helpPaint); + } + + void paintRightHandsHelpPoints(ui.Canvas canvas) { + helpPaint.strokeWidth = 4; + canvas.drawPoints( + ui.PointMode.points, + [ + // Offset(10,-68), + // Offset(75,-75), + // + Offset(140, -48), + Offset(165, -35), + + Offset(180, -17), + Offset(135, 22), + + Offset(125, 17), + Offset(135, -20), + + // Offset(55,98), + // Offset(18,78), + ], + helpPaint); + } + + void paintLeftFoodHelpPoints(ui.Canvas canvas) { + helpPaint.strokeWidth = 4; + canvas.drawPoints( + ui.PointMode.points, + [ + Offset( + 18, + 100, + ), + Offset(60, 125), + Offset(18, 78), + Offset(22, 115), + Offset(55, 98), + Offset( + 40, + 80, + ), + ], + helpPaint); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} diff --git a/lib/painter_system/gallery_factory.dart b/lib/painter_system/gallery_factory.dart index e97901f..164355c 100644 --- a/lib/painter_system/gallery_factory.dart +++ b/lib/painter_system/gallery_factory.dart @@ -5,6 +5,7 @@ import 'anim/bezier3_player/bezier3_palyer.dart'; import 'anim/circle_halo.dart'; import 'anim/curve_shower/curve_anim_shower.dart'; import 'anim/draw_path.dart'; +import 'anim/dundun_path.dart'; import 'art/circle_packing.dart'; import 'art/cubic_disarray.dart'; import 'art/hypnotic_squares.dart'; @@ -17,6 +18,7 @@ import 'base/clock_widget.dart'; import 'base/draw_grid_axis.dart'; import 'base/draw_path_fun.dart'; import 'base/draw_picture.dart'; +import 'fun/dundun_view.dart'; import 'fun/random_portrait.dart'; import 'fun/stemp/stamp_paper.dart'; import 'gallery.dart'; @@ -86,6 +88,11 @@ class GalleryFactory { author: "张风捷特烈", info: " 本样例介绍如何使用路径绘制函数曲线,并使用路径测量进行动画", content: DrawPath()), + FrameShower( + title: "冰墩墩线条动画", + author: "张风捷特烈", + info: " 本样例会绘制 2022 年北京冬奥会吉祥物冰墩墩的路径,并使用路径测量进行动画", + content: DunDunPathPage()), FrameShower( title: "Bezier3 演示 (双击清除)", author: "张风捷特烈", @@ -102,6 +109,12 @@ class GalleryFactory { info: " 本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。其中对点的随机生成和对称处理能让你练习对数据的控制力。", content: RandomPortrait()), + FrameShower( + title: "冰墩墩", + author: "张风捷特烈", + info: + " 本样例会绘制 2022 年北京冬奥会吉祥物冰墩墩的绘制,可以学到路径绘制、渐变色等知识。", + content: DunDunView()), FrameShower( title: "井字棋", author: "张风捷特烈",