| // Copyright 2019 The Flutter team. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/material.dart'; |
| import 'package:flutter/widgets.dart'; |
| |
| class BorderTabIndicator extends Decoration { |
| BorderTabIndicator({this.indicatorHeight, this.textScaleFactor}) : super(); |
| |
| final double indicatorHeight; |
| final double textScaleFactor; |
| |
| @override |
| _BorderPainter createBoxPainter([VoidCallback onChanged]) { |
| return _BorderPainter( |
| this, indicatorHeight, this.textScaleFactor, onChanged); |
| } |
| } |
| |
| class _BorderPainter extends BoxPainter { |
| _BorderPainter( |
| this.decoration, |
| this.indicatorHeight, |
| this.textScaleFactor, |
| VoidCallback onChanged, |
| ) : assert(decoration != null), |
| assert(indicatorHeight >= 0), |
| super(onChanged); |
| |
| final BorderTabIndicator decoration; |
| final double indicatorHeight; |
| final double textScaleFactor; |
| |
| @override |
| void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) { |
| assert(configuration != null); |
| assert(configuration.size != null); |
| final horizontalInset = 16 - 4 * textScaleFactor; |
| final rect = Offset(offset.dx + horizontalInset, |
| (configuration.size.height / 2) - indicatorHeight / 2 - 1) & |
| Size(configuration.size.width - 2 * horizontalInset, indicatorHeight); |
| final paint = Paint(); |
| paint.color = Colors.white; |
| paint.style = PaintingStyle.stroke; |
| paint.strokeWidth = 2; |
| canvas.drawRRect( |
| RRect.fromRectAndRadius(rect, Radius.circular(56)), |
| paint, |
| ); |
| } |
| } |