每日见闻之Container Decoration

1 Decoation 主要有两个方法

javascript 复制代码
Path getClipPath(Rect rect, TextDirection textDirection) {
  throw UnsupportedError('${objectRuntimeType(this, 'This Decoration subclass')} does not expect to be used for clipping.');
}
less 复制代码
@factory
BoxPainter createBoxPainter([ VoidCallback onChanged ]);

getClipPath 返回的是裁剪的路径,裁剪的是child的显示区域。Rect 就是Container的范围。

createBoxPainter 返回的是自定义绘制内容的BoxPointer

2 BoxPainter主要是实现下面的方法

arduino 复制代码
void paint(Canvas canvas, Offset offset, ImageConfiguration configuration);

offset Container 在父节点中的位置

configuration Container的一些信息,包含宽高

最后留下一个demo,裁剪圆形图片

scala 复制代码
// 自定义装饰:绘制矩形,但裁剪为圆形
class CircleWithRectDecoration extends Decoration {
  final Color color;

  const CircleWithRectDecoration({required this.color});

  @override
  BoxPainter createBoxPainter([VoidCallback? onChanged]) {
    return _CircleWithRectPainter(this, onChanged);
  }

  @override
  Path getClipPath(Rect rect, TextDirection textDirection) {
    // 返回圆形裁剪路径
    return Path()
      ..addRect(Rect.fromCenter(center: rect.center, width: rect.width / 2, height: rect.height/2));
  }
}

class _CircleWithRectPainter extends BoxPainter {
  final CircleWithRectDecoration decoration;

  _CircleWithRectPainter(this.decoration, VoidCallback? onChanged) : super(onChanged);

  @override
  void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {
    final rect = offset & configuration.size!;
    final paint = Paint()
      ..color = decoration.color
      ..style = PaintingStyle.fill;

    // 绘制矩形(而非圆形)
    canvas.drawOval(rect, paint);
  }
}

使用

less 复制代码
Container(
  width: 150,
  height: 150,
  clipBehavior: Clip.antiAlias, // 启用裁剪
  decoration: const CircleWithRectDecoration(color: Colors.blue),
  // 默认 clipBehavior: Clip.none,getClipPath() 无效
  child: const FlutterLogo(size: 150),
)
相关推荐
whysqwhw2 分钟前
OkHttp平台抽象机制分析
android
hsx6661 小时前
Android 内存泄漏避坑
android
whysqwhw1 小时前
OkHttp之okhttp-bom模块的分析
android
餐桌上的王子1 小时前
Android 构建可管理生命周期的应用(二)
android
幽你一默2 小时前
Android 版本差异速查表(开发者视角)
android
不萌2 小时前
android 项目中的屏幕适配方案
android
幽你一默2 小时前
Android开发三分钟读懂mvc,mvp,mvvm,mvi
android
木叶丸3 小时前
AI三大核心概念通俗指南:AIGC、Agent、MCP
人工智能·flutter·架构
小仙女喂得猪4 小时前
2025 源码应用: Retrofit之动态更换BaseUrl
android·android studio
AmazingMQ4 小时前
Android 13----在framworks层映射一个物理按键
android