- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个绘制椭圆形的 CustomPaint
。
我想在一个特定的位置切出一个洞,我还不知道它是如何工作的。
我试过:
canvas.drawPath(
Path.combine(PathOperation.difference, ovalPath, holePath),
ovalPaint,
);
但这并没有解决问题,而是给了我以下结果:
这个椭圆形只是一个例子,“真正的”定制油漆会变得更加复杂,我需要的不仅仅是一个切口。所以只画几行不是一个选择。我想先定义路径,然后应用剪切(甚至反向剪切)来获得孔。
这可能吗?
这是我所拥有的一个完整的工作示例:
import 'package:flutter/material.dart';
import 'dart:math';
const Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: darkBlue,
),
debugShowCheckedModeBanner: false,
home: const Scaffold(
body: Center(
child: OvalCustomPaint(),
),
),
);
}
}
class OvalCustomPaint extends StatelessWidget {
const OvalCustomPaint({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: LayoutBuilder(
builder: (context, constraints) {
return Center(
child: CustomPaint(
painter: _Painter(),
child: SizedBox(
width: constraints.maxWidth,
height: constraints.maxHeight,
),
),
);
},
),
);
}
}
class _Painter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
canvas.translate(size.width / 2, size.height / 2);
const curveRadius = 50.0;
const legLength = 150.0;
canvas.rotate(pi/2);
final ovalPaint = Paint()
..color = Colors.blue
..strokeWidth = 2.5
..style = PaintingStyle.stroke
..strokeCap = StrokeCap.round;
const fixPoint = Offset.zero;
//* OVAL LINE
final ovalPath = Path()..moveTo(fixPoint.dx, fixPoint.dy);
ovalPath.relativeArcToPoint(
const Offset(curveRadius * 2, 0),
radius: const Radius.circular(curveRadius),
);
ovalPath.relativeLineTo(0, legLength);
ovalPath.relativeArcToPoint(
const Offset(-curveRadius * 2, 0),
radius: const Radius.circular(curveRadius),
);
ovalPath.relativeLineTo(0, -legLength);
//* CLP HOLE
final holePath = Path();
holePath.addArc(Rect.fromCircle(center: fixPoint, radius: 13), 0, 2 * pi);
canvas.drawPath(
Path.combine(PathOperation.difference, ovalPath, holePath),
ovalPaint,
);
}
@override
bool shouldRepaint(_Painter oldDelegate) => false;
}
最佳答案
好的,我找到了解决方案。
我创建了一个大小与 CustomPainter
区域相同的矩形路径,并用切口孔路径建立了差异。
创建了一个剪切模板:
final rectWithCutout = Path.combine(
PathOperation.difference,
Path()
..addRect(
Rect.fromCenter(
center: Offset.zero,
width: size.width,
height: size.height,
),
),
holePath);
我可以用它来剪辑 Canvas :canvas.clipPath(rectWithCutout);
最终结果:
这又是完整的工作代码示例:
import 'dart:math';
import 'package:flutter/material.dart';
const Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: darkBlue,
),
debugShowCheckedModeBanner: false,
home: const Scaffold(
body: Center(
child: OvalCustomPaint(),
),
),
);
}
}
class OvalCustomPaint extends StatelessWidget {
const OvalCustomPaint({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: LayoutBuilder(
builder: (context, constraints) {
return Center(
child: CustomPaint(
painter: _Painter(),
child: SizedBox(
width: constraints.maxWidth,
height: constraints.maxHeight,
),
),
);
},
),
);
}
}
class _Painter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
canvas.translate(size.width / 2, size.height / 2);
const curveRadius = 40.0;
const legLength = 130.0;
canvas.rotate(pi / 2);
final ovalPaint = Paint()
..color = Colors.blue
..strokeWidth = 2.5
..style = PaintingStyle.stroke
..strokeCap = StrokeCap.round;
const fixPoint = Offset.zero;
//* OVAL LINE
final ovalPath = Path()..moveTo(fixPoint.dx, fixPoint.dy);
ovalPath.relativeArcToPoint(
const Offset(curveRadius * 2, 0),
radius: const Radius.circular(curveRadius),
);
ovalPath.relativeLineTo(0, legLength);
ovalPath.relativeArcToPoint(
const Offset(-curveRadius * 2, 0),
radius: const Radius.circular(curveRadius),
);
ovalPath.relativeLineTo(0, -legLength);
//* CLIP HOLE
final holePath = Path();
holePath.addArc(Rect.fromCircle(center: fixPoint, radius: 13), 0, 2 * pi);
final rectWithCutout = Path.combine(
PathOperation.difference,
Path()
..addRect(
Rect.fromCenter(
center: Offset.zero,
width: size.width,
height: size.height,
),
),
holePath);
canvas.clipPath(rectWithCutout);
canvas.drawPath(
ovalPath,
ovalPaint,
);
}
@override
bool shouldRepaint(_Painter oldDelegate) => false;
}
关于flutter CustomPainter - 如何在线路径中切出一个洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71108148/
我有一个绘制椭圆形的 CustomPaint。 我想在一个特定的位置切出一个洞,我还不知道它是如何工作的。 我试过: canvas.drawPath( Path.combine(PathO
我有一个简单的应用程序,它通过 CustomPainter 进行绘制 Canvas 上的红色或绿色圆圈,取决于在 AppBar 中按下了哪个按钮: 类(class)ColorCircle扩展 Cust
Column 的子 CustomPainter 的大小变为 (0, 0)。 1) 当我们刚刚使用 CustomPaint 和 CustomPainter 时,我们期望的大小被传递给 CustomPai
我正在渲染一组图 block 网格,其中每个图 block 都是从图像中提取的。为了渲染它,我在我自己的 CustomPainter 实现中渲染所有内容(因为网格可能会变得非常大)。为了支持平移和缩放
我有一个使用自定义涂料绘画的应用程序,我想在背景中添加一个图像,以便可以在其上绘画,但不幸的是我似乎无法弄清楚如何做到这一点,我尝试使用堆栈但每次我做的自定义油漆只会在容器上油漆,但出于某种原因永远不
我试图使用 alpha channel 通过 CustomPaint 对线条颜色应用透明度的Canvas.drawLine() . 问题 但是,alpha channel 上的颜色调整对结果没有影响,
介绍 我使用 Flutter 的 CustomPaint Widget 绘制了一个自定义标签栏,它看起来像这样: 此外,这是我用来绘制小部件的代码: class TabBarPainter exten
我想在页面的右下角画一个三角形。 我已经成功地在左上角创建了一个这样做: void paint(Canvas canvas, Size size) { // top left
我不能让自定义画家重新粉刷。 我尝试使用 Listenable、回调、setState 并没有重绘屏幕。 文档是这样说的: The most efficient way to trigger a re
我正在尝试在 custompainter 上绘制图像。我正在使用 flutter custompainter video 上的示例这是我到目前为止所拥有的。我可以在图像中绘制,但无法缩放图像。如何在手
我需要使用自定义画家在 ListTile 内呈现我的自定义对象,以便绘制一些自定义文本。 ListTile( title: CustomPaint( painter: RowPainter
我想知道是否有人对如何开始使用 CustomPainter 在 flutter 中绘制心形有任何指示。我已经设法画了三角形和正方形,或者一个基本的圆,但心当然有直线和曲线。 我有这个画一个三角形,看起
这就是我想要构建的: (只看 appBar 的形状而不是内容) 这是我的: 我希望边缘是弯曲的,而不是那么尖锐。 这是我的 CustomPaint 代码: class LogoPainter exte
我有以下小部件: class OutsiderButton extends StatelessWidget { final Function onPressed; final Icon ico
我实现了一个 CustomPainter。在 shouldRepaint 方法中,我必须比较 6 组深度相等性。我现在正在使用 setsEqual 来做这件事。如果它们非常相等,则无需重新绘制,但真的
我正在尝试在 CustomPainter 中创建一个动画,其中动画从底部开始向上,但它是从顶部开始的。 当点击 FloatActionButton 时,矩形应该上升到屏幕的最大高度,当再次点击时返回到
这个问题在这里已经有了答案: How to touch paint a canvas? (2 个答案) 关闭 4 年前。 我有一个大小为 300、300 的 CustomPaoint。在这个下方我还
因此,我正在尝试按照“签名 Canvas ”方法使用 Flutter 创建一个绘图应用程序。但是,我无法更改 CustomPaint 对象的颜色,而它在更改之前已经更改了每条线条绘制的颜色,如下所示:
我正在尝试在 Flutter 中的相机预览上显示 CustomPaint 元素。现在,CustomPaint 元素显示在相机预览下方。我正在使用 Flutter camera plugin显示相机预览
我正在尝试创建一个简单的小部件,以便当用户按下屏幕时,该位置会出现一个圆圈。我有一个由 Listener 小部件包装的 CustomPaint 小部件,如下所示: new
我是一名优秀的程序员,十分优秀!