#flutter #flutter-layout
Вопрос:
Как сделать так, чтобы форма подсказки использовала путь ?
я пытаюсь сделать границу формы :
class TooltipShapeBorder extends ShapeBorder {
final double arrowWidth;
final double arrowHeight;
final double arrowArc;
final double radius;
TooltipShapeBorder({
this.radius = 0,
this.arrowWidth = 16.0,
this.arrowHeight = 8.0,
this.arrowArc = 0.0,
}) : assert(arrowArc <= 1.0 amp;amp; arrowArc >= 0.0);
@override
EdgeInsetsGeometry get dimensions => EdgeInsets.only(bottom: arrowHeight);
@override
Path getInnerPath(Rect rect, {TextDirection? textDirection}) =>
null ?? Path();
@override
Path getOuterPath(Rect rect, {TextDirection? textDirection}) {
rect = Rect.fromPoints(
rect.topLeft, rect.bottomRight - Offset(0, arrowHeight));
double x = arrowWidth, y = arrowHeight, r = 1 - arrowArc;
return Path()
..addRRect(RRect.fromRectAndRadius(rect, Radius.circular(radius)))
..moveTo(rect.topRight.dx - 30, rect.topRight.dy)
..relativeLineTo(-x / 2 * r, -y * r)
..relativeQuadraticBezierTo(
-x / 2 * (1 - r), y * (1 - r), -x * (1 - r), 0)
..relativeLineTo(-x / 2 * r, y * r);
}
@override
void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) {}
@override
ShapeBorder scale(double t) => this;
}
и после многих попыток вот мой шанс
не могли бы вы помочь мне решить некоторые проблемы с этим дизайном?
Ответ №1:
Вот граница фиксированной формы. Я просто добавил -
к y1
relativeQuadraticBezierTo
этому . Пути во Флаттере: Визуальное руководство будет полезным.
class TooltipShapeBorder extends ShapeBorder {
final double arrowWidth;
final double arrowHeight;
final double arrowArc;
final double radius;
TooltipShapeBorder({
this.radius = 0,
this.arrowWidth = 16.0,
this.arrowHeight = 8.0,
this.arrowArc = 0.0,
}) : assert(arrowArc <= 1.0 amp;amp; arrowArc >= 0.0);
@override
EdgeInsetsGeometry get dimensions => EdgeInsets.only(bottom: arrowHeight);
@override
Path getInnerPath(Rect rect, {TextDirection? textDirection}) =>
null ?? Path();
@override
Path getOuterPath(Rect rect, {TextDirection? textDirection}) {
rect = Rect.fromPoints(
rect.topLeft, rect.bottomRight - Offset(0, arrowHeight));
double x = arrowWidth, y = arrowHeight, r = 1 - arrowArc;
return Path()
..addRRect(RRect.fromRectAndRadius(rect, Radius.circular(radius)))
..moveTo(rect.topRight.dx - 30, rect.topRight.dy)
..relativeLineTo(-x / 2 * r, -y * r)
..relativeQuadraticBezierTo(
-x / 2 * (1 - r), -y * (1 - r), -x * (1 - r), 0)
..relativeLineTo(-x / 2 * r, y * r);
}
@override
void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) {}
@override
ShapeBorder scale(double t) => this;
}