| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:ui' as ui show lerpDouble; |
| |
| import 'package:flutter/foundation.dart'; |
| |
| import 'borders.dart'; |
| import 'circle_border.dart'; |
| |
| /// A border that fits an elliptical shape. |
| /// |
| /// Typically used with [ShapeDecoration] to draw an oval. Instead of centering |
| /// the [Border] to a square, like [CircleBorder], it fills the available space, |
| /// such that it touches the edges of the box. There is no difference between |
| /// `CircleBorder(eccentricity = 1.0)` and `OvalBorder()`. [OvalBorder] works as |
| /// an alias for users to discover this feature. |
| /// |
| /// See also: |
| /// |
| /// * [CircleBorder], which draws a circle, centering when the box is rectangular. |
| /// * [Border], which, when used with [BoxDecoration], can also describe an oval. |
| class OvalBorder extends CircleBorder { |
| /// Create an oval border. |
| const OvalBorder({ super.side, super.eccentricity = 1.0 }); |
| |
| @override |
| ShapeBorder scale(double t) => OvalBorder(side: side.scale(t), eccentricity: eccentricity); |
| |
| @override |
| OvalBorder copyWith({ BorderSide? side, double? eccentricity }) { |
| return OvalBorder(side: side ?? this.side, eccentricity: eccentricity ?? this.eccentricity); |
| } |
| |
| @override |
| ShapeBorder? lerpFrom(ShapeBorder? a, double t) { |
| if (a is OvalBorder) { |
| return OvalBorder( |
| side: BorderSide.lerp(a.side, side, t), |
| eccentricity: clampDouble(ui.lerpDouble(a.eccentricity, eccentricity, t)!, 0.0, 1.0), |
| ); |
| } |
| return super.lerpFrom(a, t); |
| } |
| |
| @override |
| ShapeBorder? lerpTo(ShapeBorder? b, double t) { |
| if (b is OvalBorder) { |
| return OvalBorder( |
| side: BorderSide.lerp(side, b.side, t), |
| eccentricity: clampDouble(ui.lerpDouble(eccentricity, b.eccentricity, t)!, 0.0, 1.0), |
| ); |
| } |
| return super.lerpTo(b, t); |
| } |
| |
| @override |
| String toString() { |
| if (eccentricity != 1.0) { |
| return '${objectRuntimeType(this, 'OvalBorder')}($side, eccentricity: $eccentricity)'; |
| } |
| return '${objectRuntimeType(this, 'OvalBorder')}($side)'; |
| } |
| } |