【剪裁 widget】Flutter ClipOval 与 Flutter ClipRRect

简介: 【剪裁 widget】Flutter ClipOval 与 Flutter ClipRRect

image.png

本文是 【剪裁 widget】系列的第三篇,也是最后一篇,今天介绍一下ClipOval 和 ClipRRect。

ClipOval 介绍

Flutter ClipOval 用 椭圆形去剪裁 child,path 以外的部分不显示,还能高效的实现动画。

剪裁是在绘制阶段,具体实现是在 paint 方法中调用 PaintingContext 类的 pushClipPath 方法进行剪裁。

void paint(PaintingContext context, Offset offset) { 
...
 layer = context.pushClipPath(
    needsCompositing,
    offset,
    Offset.zero & size,
    _clip!,
    super.paint,
    clipBehavior: clipBehavior,
    oldLayer: layer as ClipPathLayer?,
  );
 ...
}
复制代码

和 ClipPath 一样,调用 PaintingContext 的 pushClipPath。所以从本质上来看, ClipOval 和 ClipPath是一样的,相当于是给 ClipPath 起了一个别名。ClipOval 的唯一价值就是可以增加可读性,而且它会把 Rect 自动转为 Oval path,用起来更方便些。

Path _getClipPath(Rect rect) {
    if (rect != _cachedRect) {
      _cachedRect = rect;
      _cachedPath = Path()..addOval(_cachedRect!);
    }
    return _cachedPath;
}
复制代码

ClipPath 的参数 clipper 的类型是 CustomClipper,ClipOval 的参数 clipper 的类型是 CustomClipper,所以ClipOval更容易使用。上面代码_getClipPath 的参数 rect 就是 clipper.getClip 返回的 Rect。

ClipOval 的默认效果是把原来的矩形 widget 剪裁成 内切椭圆,如果原来的矩形是正方形,那么剪裁的结果就是一个圆。如果要得到不同的剪裁结果 ,就需要自定义剪裁。

自定义 Oval 剪裁

我们可以指定 clipper 参数进行自定义裁剪。

举个例子,我们想裁剪出花朵的部分。图片大小为 100 x 100。

image.png

class MyClipper extends CustomClipper<Rect> {
  @override
  Rect getClip(Size size) {
    return Rect.fromLTWH(20, 10, 65, 65);
  }
  @override
  bool shouldReclip(covariant CustomClipper<Rect> oldClipper) {
    return false;
  }
}
复制代码
Center(
    child: ClipOval(
      clipper: MyClipper(),
      child: Image.network(
        'https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9eb382cf5d7341938dfbf6fa2442242e~tplv-k3u1fbpfcp-watermark.image?',
       width: 100,
       height: 100,
     ),
   ),
);
复制代码

ClipPath 的 MyClipper 几乎完全一样,就是把类型换成了 Rect。

ClipRRect 介绍

Flutter ClipRRect 用圆角矩形去剪裁 child,path 以外的部分不显示,还能高效的实现动画。

剪裁是在绘制阶段,具体实现是在 paint 方法中调用 PaintingContext 类的 pushClipRRect 方法进行剪裁。只是比 ClipRect 多了一个参数 borderRadius,clipper 的类型不同。

默认情况下 ClipRRect 没有效果的,指定 borderRadius,可以把四角剪裁成圆角,但如果要在不同的位置进行剪裁,需要自定义。

下面通过一个示例演示一下 ClipRRect 自定义剪裁的用法

自定义 RRect 剪裁

image.png

class MyClipper extends CustomClipper<RRect> {
  @override
  RRect getClip(Size size) {
    return RRect.fromRectAndRadius(Rect.fromLTWH(20, 10, 65, 65),Radius.circular(21));
  }
  @override
  bool shouldReclip(covariant CustomClipper<RRect> oldClipper) {
    return false;
  }
}
复制代码
Center(
   child: ClipRRect(
     borderRadius:BorderRadius.all(Radius.circular(21)) ,
     clipper: MyClipper(),
     child: Image.network(
       'https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/85a4c49c34434ef3a21dc9458c355866~tplv-k3u1fbpfcp-watermark.image?',
         width: 100,
         height: 100,
       ),
     ),
   )
复制代码

应用场景

Flutter ClipOval 与 Flutter ClipRRect 的应用场景和 ClipRect 是一样的,不再赘述,也是剪裁 widget 和制作动画。在 【剪裁 widget】Flutter ClipRect 一文中对如何写动画有举例。

剪裁 widget 结束语

如果你是按顺序先看第一篇 ClipRect,再看第二篇 ClipPath,然后再看这篇,你会觉得非常轻松。知识是有联系的,找到破入点,然后一网打尽。

目录
相关文章
|
2月前
Flutter-底部弹出框(Widget层级)
文章描述了如何在Flutter中使用DraggableScrollableSheet创建一个底部弹出框,同时保持其可手势滑动关闭。作者遇到问题并提出对原控件进行扩展,以支持头部和列表布局的滑动关闭功能。
129 0
|
3月前
Flutter StreamBuilder 实现局部刷新 Widget
Flutter StreamBuilder 实现局部刷新 Widget
28 0
|
4月前
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
|
4月前
|
JavaScript 前端开发 开发者
【Flutter前端技术开发专栏】Flutter中的Widget与状态管理
【4月更文挑战第30天】本文探讨了Flutter的Widget和状态管理。Widget是Flutter构建UI的基础,分为有状态和无状态两种。状态管理确保UI随应用状态变化更新,影响应用性能和可维护性。文章介绍了`setState`、`Provider`、`Riverpod`、`Bloc`和`Redux`等状态管理方法,并通过计数器应用展示了其实现。选择合适的状态管理策略对高效开发至关重要。
59 0
【Flutter前端技术开发专栏】Flutter中的Widget与状态管理
|
4月前
|
编解码 算法 开发者
Flutter的布局系统:深入探索布局Widget与布局原则
【4月更文挑战第26天】Flutter布局系统详解,涵盖布局Widget(Row/Column、Stack、GridView/ListView、CustomSingleChildLayout)和布局原则(弹性布局、约束优先、流式布局、简洁明了)。文章旨在帮助开发者理解并运用Flutter的布局系统,创建适应性强、用户体验佳的界面。通过选择合适的布局Widget和遵循原则,可实现复杂且高效的UI设计。
|
4月前
|
前端开发 开发者 UED
Flutter的自定义Painter:深入探索自定义绘制Widget的技术实现
【4月更文挑战第26天】Flutter的自定义Painter允许开发者根据需求绘制独特UI,通过继承`CustomPaint`类和重写`paint`方法实现。在`paint`中使用`Canvas`绘制图形、路径等。创建自定义Painter类后,将其作为`CustomPaint` Widget的`painter`属性使用。此技术可实现自定义形状、渐变、动画等复杂效果,提升应用视觉体验。随着Flutter的进化,自定义Painter将提供更丰富的功能。
|
4月前
|
开发框架 搜索推荐 Android开发
Flutter的Widget基础:概念、分类与深入探索
【4月更文挑战第26天】Flutter Widget详解:基础、分类与工作原理。Widget是Flutter UI的核心,描述界面外观而非直接渲染。分为基础、布局、可滚动及状态管理四大类。基于响应式编程,状态变化时自动更新UI。了解其概念、分类和原理,能助开发者高效构建精美应用。随着Flutter生态发展,Widget系统潜力无限。
Flutter源码分析笔记:Widget类源码分析
本文记录阅读与分析Flutter源码 - Widget类源码分析。
84 0
Flutter源码分析笔记:Widget类源码分析
|
Dart 前端开发 开发工具
谷歌移动UI框架Flutter教程之Widget
谷歌移动UI框架Flutter教程之Widget
Flutter的ClipRRect控件介绍
ClipRRect(Rounded Rectangle Clip)是Flutter中的一个控件,用于将其子控件剪裁为圆角矩形形状。