内容简介:在前面的文章中,我们介绍了前面我们说过在ClipPath Extends Map
在前面的文章中,我们介绍了 Dart 的两种编译时,以及 Hot reload 模式。今天我们来看下在 Flutter 中创建不规则Widget的方式。 Android 原生中,我们在创建不规则边界 View 时,是通过 clipPath 的方式来实现,在 Flutter 中也有相关的概念,下面我们来学习下 Flutter 中的 ClipPath 相关概念及用法。
ClipPath Widget
前面我们说过在 Flutter 中 Everything is Widget ,那么要使用 Path 自然也有对应的 Widget 对象- ClipPath 。
ClipPath Extends Map
ClipPath Widget 继承关系如下图:
enter image description here
ClipPath Introduce
官方文档中 ClipPath 说明如下:
A widget that clips its child using a path.
和 ClipPath 相关的属性有三个:
- child:
Widget类型,裁剪的Widget对象 - clipper:定义裁剪路径的
CustomClipper对象,其内部提供一个裁剪路径和是否需要重新裁剪 - clipBehavior:裁剪
Widget的模式,默认取值为Clip.antiAlias,可选取值有Clip.none,Clip.hardEdge,Clip.antiAlias,Clip.antiAliasWithSaveLayer.
裁剪模式取值的区别:
- none:无模式
- hardEdge:裁剪速度稍快,但容易失真,有锯齿
- antiAlias:裁剪边缘抗锯齿,使得裁剪更平滑,这种模式裁剪速度比
antiAliasWithSaveLayer快,但是比hardEdge慢,该模式常用于圆形和弧形之类的形状裁剪 - antiAliasWithSaveLayer:裁剪后具有抗锯齿特性并分配屏幕缓冲区,所有后续操作在缓冲区进行,然后再进行裁剪和合成
ClipPath Use
在代码中我们可以使用如下代码声明一个 ClipPath Widget ,
1ClipPath(
2 child: Image.asset('images/coffee.jpg'),//裁剪的Widget对象,这里是一个Image Widget
3 clipper: BottomWaveClipper(),//裁剪路径
4 )
复制代码
其中 BottomWaveClipper 定义了 Image Widget 的裁剪路径,是 CustomClipper 的子类,代码如下:
1class BottomWaveClipper extends CustomClipper<Path>{
2
3 @override
4 Path getClip(Size size) {
5 var path = Path();
6 path.lineTo(0.0, size.height-20);
7
8 //控制点1
9 var firstControlPoint = Offset(size.width/4, size.height);
10 //第一段贝塞尔曲线终点
11 var firstEndPoint = Offset(size.width/2.25, size.height-30);
12 path.quadraticBezierTo(firstControlPoint.dx, firstControlPoint.dy, firstEndPoint.dx, firstEndPoint.dy);
13
14 //控制点2
15 var secondControlPoint = Offset(size.width - (size.width / 3.25), size.height - 65);
16 //第二段贝塞尔曲线终点
17 var secondEndPoint = Offset(size.width, size.height - 40);
18 path.quadraticBezierTo(secondControlPoint.dx, secondControlPoint.dy,
19 secondEndPoint.dx, secondEndPoint.dy);
20
21 path.lineTo(size.width, size.height - 40);
22 path.lineTo(size.width, 0.0);
23 path.close();
24 return path;
25 }
26
27 @override
28 bool shouldReclip(CustomClipper<Path> oldClipper) {
29 //是否重新裁剪
30 return false;
31 }
32}
复制代码
利用上述代码构建的裁剪 Image Widget 如下:
enter image description here
完整的 WavyHeaderImage Widget 相关代码如下:
1import 'package:flutter/material.dart';
2
3class WavyHeaderImage extends StatelessWidget {
4
5 @override
6 Widget build(BuildContext context) {
7 return ClipPath(
8 child: Image.asset('images/coffee.jpg'),
9 clipper: BottomWaveClipper(),
10 );
11 }
12}
13
14class BottomWaveClipper extends CustomClipper<Path>{
15
16 @override
17 Path getClip(Size size) {
18 var path = Path();
19 path.lineTo(0.0, size.height-20);
20
21 var firstControlPoint = Offset(size.width/4, size.height);
22 var firstEndPoint = Offset(size.width/2.25, size.height-30);
23 path.quadraticBezierTo(firstControlPoint.dx, firstControlPoint.dy, firstEndPoint.dx, firstEndPoint.dy);
24
25 var secondControlPoint = Offset(size.width - (size.width / 3.25), size.height - 65);
26 var secondEndPoint = Offset(size.width, size.height - 40);
27 path.quadraticBezierTo(secondControlPoint.dx, secondControlPoint.dy,
28 secondEndPoint.dx, secondEndPoint.dy);
29
30 path.lineTo(size.width, size.height - 40);
31 path.lineTo(size.width, 0.0);
32 path.close();
33 return path;
34 }
35
36 @override
37 bool shouldReclip(CustomClipper<Path> oldClipper) {
38 return false;
39 }
40}
复制代码
1 @override
2 Widget build(BuildContext context) {
3 return new Scaffold(
4 backgroundColor: Colors.blueGrey,
5 body: WavyHeaderImage(),
6 );
7 }
复制代码
个人微信公众号,欢迎大家加入。
enter image description here
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
人件(原书第3版)
[美] Tom DeMarco、[美] Timothy Lister / 肖然、张逸、滕云 / 机械工业出版社 / 2014-8 / 69.00元
在软件管理领域,很少有著作能够与本书媲美。作为经久不衰的畅销书,本书深刻地洞察到软件开发的最大问题不在于技术,而在于人。人的因素并不容易解决,一旦解决了,你将更有可能获得成功。 本书是软件管理领域的传奇经典,被誉为“对美国软件业影响最大的一本书”。全书从管理人力资源、创建健康的办公环境、雇用并留用正确的人、高效团队形成、改造企业文化和快乐工作等多个角度阐释了如何思考和管理软件开发的最大问题—......一起来看看 《人件(原书第3版)》 这本书的介绍吧!
MD5 加密
MD5 加密工具
RGB CMYK 转换工具
RGB CMYK 互转工具