Flutter Widget 之ClipOval

458 阅读2分钟

有时,图片或屏幕的其他部分看起来可能过于方正,这些棱角真丑!

image.png

若这张图像这样改成圆形,不是更好?

image.png

有个小部件可将其子集裁剪为圆形和椭圆形名为ClipOval

以任何小部件为例,例如此处的Image然后以ClipOval包裹来布局

ClipOval(
    child: Image.asset('dash.jpg')
)

默认情况下,ClipOval会配合子级的带下来呈现,所以这张狭长图会被裁减成椭圆形

ezgif.com-gif-maker.gif 如果图片很宽,则生成的椭圆也会很宽

ezgif.com-gif-maker (1).gif

遇上正方形子级时,椭圆形将化为圆形,因为长宽等距的椭圆就是圆形

ezgif.com-gif-maker (2).gif

但是,您无需为了改变椭圆的形状而费心调整子级的大小,只需价格自定义clipper就可以任意决定大小了

ClipOval(
    clipper: MyClipper(),
    child: Image.asset('dash.jpg'),
)

你必须以新的类(class)来运行这个能扩展CustomClipper并能执行两种方法的clipper。也就是getClip和shouldReclip这两种

class MyClipper extends CustomClipper<Rect>{
    Rect getClip(Size size) {
        //...
    }
    
    bool shouldReclip(oldClipper) {
        //...
    }
}

其中,getClip套用的是子级的大小 然后回归Rect结构 让Flutter以此为本来绘制椭圆,您可任意放置Rect,并调成任意大小。

例如此例中,我们将椭圆置于子级左上角且不管子级尺寸,定义宽度为200像素,高度为100像素

Rect getClip(Size size) {
    return Rect.fromLTWH(0, 0, 200, 100);
}

CustomClipper的另一种方法是shouldReclip,会指示Flutter根据Clipper先前状态来判定是否须再次剪辑,为优化性能,

ezgif.com-gif-maker (3).gif

若确定Clipper当前状态将产出相同的剪辑,就传false

以上就是ClipOval简介,请记住,在Flutter,你可以完全掌握图像,因此你绝对可以用ClipOval的动画设计来产生有趣的效果

如果想了解有关ClipOval的内容,或者关于Flutter的其他功能,请访问flutter.dev

原文翻译自视频:视频地址