import 'package:flutter/material.dart'; import 'package:recook/constants/header.dart'; ///圆角indicator /// ///fork from RecookIndicator /// ///仅仅在发现页面中使用 class RecookIndicator extends Decoration { const RecookIndicator({ this.borderSide = const BorderSide(width: 2.0, color: Colors.white), this.insets = EdgeInsets.zero, }) : assert(borderSide != null), assert(insets != null); final BorderSide borderSide; final EdgeInsetsGeometry insets; @override Decoration lerpFrom(Decoration a, double t) { if (a is RecookIndicator) { return RecookIndicator( borderSide: BorderSide.lerp(a.borderSide, borderSide, t), insets: EdgeInsetsGeometry.lerp(a.insets, insets, t), ); } return super.lerpFrom(a, t); } @override Decoration lerpTo(Decoration b, double t) { if (b is RecookIndicator) { return RecookIndicator( borderSide: BorderSide.lerp(borderSide, b.borderSide, t), insets: EdgeInsetsGeometry.lerp(insets, b.insets, t), ); } return super.lerpTo(b, t); } @override _UnderlinePainter createBoxPainter([VoidCallback onChanged]) { return _UnderlinePainter(this, onChanged); } } class _UnderlinePainter extends BoxPainter { _UnderlinePainter(this.decoration, VoidCallback onChanged) : assert(decoration != null), super(onChanged); final RecookIndicator decoration; BorderSide get borderSide => decoration.borderSide; EdgeInsetsGeometry get insets => decoration.insets; Rect _indicatorRectFor(Rect rect, TextDirection textDirection) { assert(rect != null); assert(textDirection != null); final Rect indicator = insets.resolve(textDirection).deflateRect(rect); return Rect.fromLTWH( indicator.left, indicator.bottom - borderSide.width, indicator.width, borderSide.width, ); } @override void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) { assert(configuration != null); assert(configuration.size != null); final Rect rect = offset & configuration.size; final TextDirection textDirection = configuration.textDirection; final Rect indicator = _indicatorRectFor(rect, textDirection).deflate(borderSide.width / 2.0); final Paint paint = borderSide.toPaint()..strokeCap = StrokeCap.round; canvas.drawLine( indicator.bottomLeft + Offset(rSize(6), 0), indicator.bottomRight - Offset(rSize(6), 0), paint, ); } }