首页 > 其他分享 >【剪裁 widget】Flutter ClipOval 与 Flutter ClipRRect

【剪裁 widget】Flutter ClipOval 与 Flutter ClipRRect

时间:2023-05-05 10:33:07浏览次数:33  
标签:clipper widget Flutter ClipOval ClipRRect 剪裁 Rect

本文是 【剪裁 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。

【剪裁 widget】Flutter ClipOval 与 Flutter ClipRRect_自定义

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-ju.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 剪裁

【剪裁 widget】Flutter ClipOval 与 Flutter ClipRRect_iOS_02

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,然后再看这篇,你会觉得非常轻松。知识是有联系的,找到破入点,然后一网打尽。

标签:clipper,widget,Flutter,ClipOval,ClipRRect,剪裁,Rect
From: https://blog.51cto.com/JackieLion/6244928

相关文章

  • Flutter 如何将代码显示到界面上
    前言如何优雅的将项目中的代码,亦或是你的demo代码展示到界面上?本文对使用简单、便于维护且通用的解决方案,进行相关的对比和探究为了节省大家的时间,把最终解决方案的相关接入和用法写在前面预览代码快速开始接入:pub,githubdependencies:code_preview:^0.1.5用法:CodeP......
  • flutter 配置
    安装https://zhuanlan.zhihu.com/p/528196912?utm_id=0模拟器联网https://www.jianshu.com/p/bfe15bb4dfe7设置镜像代理(如下图一,镜像地址是mirrors.neusoft.edu.cn:80),设置完成之后,同步一下,如果是首次设置,会出现一个弹框(如下图二,要填写一下镜像,镜像地址是mirrors.neusoft.edu.c......
  • 一统天下 flutter - widget 基础: Key - 键
    源码https://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget基础:Key-键示例如下:lib\widget\basic\key.dart/**Key-键**LocalKey和GlobalKey用于让element找到widget*GlobalKey也可以用于获取对应的Widget/State/Rende......
  • pyqt5-QListWidget
    1、介绍list组件,或者说列表组件。2、类和初始化classQListWidget(QListView):快速查询:QListWidget(parent:typing.Optional[QWidget]=None)addItem(self,aitem:QListWidgetItem)addItem(self,label:str)addItems(self,labels:Iterable[str])clear(self)closeP......
  • 一统天下 flutter - widget 布局类(可以有多个子): CustomMultiChildLayout - 自定义多
    源码https://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget布局类(可以有多个子):CustomMultiChildLayout-自定义多组件布局示例如下:lib\widget\layout\custom_multi_child_layout.dart/**CustomMultiChildLayout-自定义多组件布局*......
  • 一统天下 flutter - widget 容器类(只能有一个子): CustomSingleChildLayout - 自定义单
    源码https://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget容器类(只能有一个子):CustomSingleChildLayout-自定义单组件布局示例如下:lib\widget\container\custom_single_child_layout.dart/**CustomSingleChildLayout-自定义单组件布......
  • Flutter的路在哪里?
    跨平台技术现已成为企业提升研发效率和动态化能力,抢占新赛道的搏击场。从闲鱼到淘宝,从QQ到微信,从京东到百度,从美团到抖音,BAT等一线互联网大厂在全面拥抱Flutter。2020短短一年里,Flutter在GitHub和StackOverflow已经赶超ReactNative成为开发者首选跨平台框架。尽管Flutter在某些......
  • 一统天下 flutter - widget 列表类: Dismissible - 滑动删除
    源码https://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget列表类:Dismissible-滑动删除示例如下:lib\widget\list\dismissible.dart/**Dismissible-滑动删除**支持左滑/右滑/上滑/下滑删除,一般在列表中使用,当然也可以不依托列表......
  • 一统天下 flutter - widget 列表类: DataTable - 数据表格
    源码https://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget列表类:DataTable-数据表格示例如下:lib\widget\list\data_table.dart/**DataTable-数据表格*/import'dart:math';import'package:flutter/material.dart';import......
  • Android原生项目引入Flutter
    原文地址www.jianshu.com前言目前Flutter可以说是非常火热了,多次更新过后也越来越稳定,受到了很多开发者的青睐。不过纯Flutter开发还是存在一定成本和风险的,尤其是对于规模稍大一些的项目,可能更加适合的是将Flutter用于项目中的某一个模块,因此我们有必要了解一下如何在原生......