import 'package:flutter/material.dart'; ///渐变indicator /// ///fork from TabIndicator /// ///仅仅在发现页面中使用 class ASTabIndicator extends Decoration { const ASTabIndicator({ this.borderSide = const BorderSide(width: 4.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 ASTabIndicator) { return ASTabIndicator( 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 ASTabIndicator) { return ASTabIndicator( 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 ASTabIndicator 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.square ..shader = LinearGradient(colors: [ Color(0xFFE50112), Color(0xFFFFB1B1), ]).createShader(rect); canvas.drawLine(indicator.bottomLeft, indicator.bottomRight, paint); } }