getOuterPath method

  1. @override
Path getOuterPath(
  1. Rect rect, {
  2. TextDirection? textDirection,
})
override

生成外轮廓路径

  1. 创建圆角矩形主体
  2. 根据offset/position计算箭头位置
  3. 组合路径形成对话框气泡形状 @return 包含箭头的气泡路径

Implementation

@override

/// 生成外轮廓路径
///
/// 1. 创建圆角矩形主体
/// 2. 根据offset/position计算箭头位置
/// 3. 组合路径形成对话框气泡形状
/// @return 包含箭头的气泡路径
Path getOuterPath(Rect rect, {TextDirection? textDirection}) {
  Path a = Path()
    ..addRRect(
      RRect.fromRectAndRadius(
        Rect.fromLTWH(rect.left, rect.top, rect.size.width,
            rect.size.height - arrowSize.height),
        Radius.circular(4),
      ),
    );

  double offset = this.offset;
  if (position != null) {
    if (position! >= 0) {
      offset = position! / rect.size.width;
    } else {
      offset = (rect.size.width + position!) / rect.size.width;
    }
  }

  Offset p1 = Offset(rect.size.width * offset + rect.left,
      rect.size.height - arrowSize.height + rect.top);
  Offset p2 = Offset(
      rect.size.width * offset - arrowSize.width / 2 + rect.left,
      rect.size.height + rect.top);
  Offset p3 = Offset(rect.size.width * offset - arrowSize.width + rect.left,
      rect.size.height - arrowSize.height + rect.top);
  Path b = Path()..addPolygon([p1, p2, p3], true);

  return Path.combine(PathOperation.xor, a, b);
}