guru_sdk/guru_ui/lib/widget/tips/tips_clipper.dart

60 lines
1.4 KiB
Dart

/// Created by @Haoyi on 2020/12/29
///
///
///
part of 'tips.dart';
enum TipsNip { none, left, right, top, bottom }
class TipsClipper extends CustomClipper<Path> {
final TipsNip nip;
Radius? radius;
final double nipRadius;
final double nipWidth;
final double nipHeight;
final double nipOffset;
late double _nipPX;
late double _nipPY;
TipsClipper(
{this.nip = TipsNip.top,
this.nipOffset = 0,
this.radius,
this.nipRadius = 4,
this.nipHeight = 8,
this.nipWidth = 16}) {
var k = nipHeight / (nipWidth * 0.5);
_nipPX = nipRadius / sqrt(1 + k * k);
_nipPY = _nipPX * k;
print("_nipPX:$_nipPX _nipPy:$_nipPY nipHeight:$nipHeight $nipWidth");
}
@override
Path getClip(Size size) {
final path = Path();
switch (nip) {
case TipsNip.top:
path.addRRect(
RRect.fromLTRBR(0, nipHeight, size.width, size.height, radius ?? Radius.circular(8)));
path.moveTo(nipOffset - (nipWidth / 2), nipHeight);
path.lineTo(nipOffset - _nipPX, _nipPY);
path.arcToPoint(Offset(nipOffset + _nipPX, _nipPY),
radius: Radius.circular(nipRadius), clockwise: true);
path.lineTo(nipOffset + (nipWidth / 2), nipHeight);
path.close();
break;
default:
break;
}
return path;
}
@override
bool shouldReclip(covariant CustomClipper<Path> oldClipper) {
return false;
}
}