每日见闻之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),
)
相关推荐
执明wa1 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
404_coder2 小时前
源码视角下的 Android 开机流程:从 Zygote、SystemServer 到 Launcher
android
二流小码农2 小时前
鸿蒙开发:以登录案例了解代码架构MVVM
android·ios·harmonyos
用户69371750013843 小时前
从代码生产者到 AI 协作者:软件工程师的角色重构
android·前端·后端
GitLqr3 小时前
别在 Flutter 的 main() 里乱锁屏幕方向,小心 iPad 分屏功能被你搞没了
android·flutter·ios
sg_knight3 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db
爱笑鱼3 小时前
Binder(四):ioctl(BINDER_WRITE_READ) 之后,事务怎样到达目标进程?
android
AFinalStone3 小时前
Android 7系统休眠唤醒(二)开机全链路—BootROM到Launcher
android·电源管理·休眠唤醒
Mr YiRan4 小时前
Android NDK开发之统计到未被回收的图片
android