123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import 'dart:math';
- import 'package:flutter/cupertino.dart';
- import 'package:flutter/painting.dart';
- class RoundPathWidget extends StatelessWidget {
- final Widget child;
- final double leftTopRadius;
- final double rightTopRadius;
- final double leftBottomRadius;
- final double rightBottomRadius;
- final PathShapeEnum pathShape;
- final double radius;
- RoundPathWidget(
- {@required this.child,
- this.radius = 0,
- this.pathShape = PathShapeEnum.CirclePath,
- this.leftTopRadius = 0,
- this.rightTopRadius = 0,
- this.leftBottomRadius = 0,
- this.rightBottomRadius = 0})
- : assert(child != null);
- @override
- Widget build(BuildContext context) {
- return ClipPath(
- clipper: RoundPathClipper(
- leftTopRadius: leftTopRadius,
- rightTopRadius: rightTopRadius,
- leftBottomRadius: leftBottomRadius,
- rightBottomRadius: rightBottomRadius,
- pathShape: pathShape,
- radius: radius),
- child: child,
- );
- }
- }
- ///枚举定义展示样式:圆形,圆角矩形,不同角不同圆角设置
- enum PathShapeEnum { CirclePath, RoundRect, PartRoundRect }
- class RoundPathClipper extends CustomClipper<Path> {
- final double leftTopRadius;
- final double rightTopRadius;
- final double leftBottomRadius;
- final double rightBottomRadius;
- final PathShapeEnum pathShape;
- final double radius;
- RoundPathClipper(
- {this.pathShape,
- this.radius,
- this.leftTopRadius,
- this.rightTopRadius,
- this.leftBottomRadius,
- this.rightBottomRadius});
- @override
- Path getClip(Size size) {
- final width = size.width;
- final height = size.height;
- final path = Path();
- if (PathShapeEnum.CirclePath == pathShape) {
- path.addOval(Rect.fromLTRB(0, 0, width, height));
- } else if (PathShapeEnum.RoundRect == pathShape) {
- path.addRRect(RRect.fromRectAndRadius(Rect.fromLTWH(0, 0, width, height), Radius.circular(radius)));
- } else {
- final leftTopRect =
- Rect.fromLTRB(0, 0, leftTopRadius * 2, leftTopRadius * 2);
- final leftBottomRect = Rect.fromLTRB(
- 0, height - leftBottomRadius * 2, leftBottomRadius * 2, height);
- final rightTopRect = Rect.fromLTRB(
- width - 2 * rightTopRadius, 0, width, rightTopRadius * 2);
- final rightBottomRect = Rect.fromLTRB(width - 2 * rightBottomRadius,
- height - rightBottomRadius * 2, width, height);
- //左上角 圆弧
- path.arcTo(leftTopRect, 180 / 180 * pi, 90 / 180 * pi, false);
- //右上角圆弧
- path.lineTo(width - rightTopRadius, 0);
- path.arcTo(rightTopRect, 270 / 180 * pi, 90 / 180 * pi, false);
- //右下角
- path.lineTo(width, height - rightBottomRadius);
- path.arcTo(rightBottomRect, 0, 90 / 180 * pi, false);
- //左下角
- path.lineTo(leftBottomRadius, height);
- path.arcTo(leftBottomRect, 90 / 180 * pi, 90 / 180 * pi, false);
- path.close();
- }
- return path;
- }
- @override
- bool shouldReclip(CustomClipper<Path> oldClipper) {
- return false;
- }
- }
|