现在人们对于网站的美感要求是越来越高了,所以很多布局需要优美的曲线设计。当然最简单的办法是作一个PNG的透明图片,然后外边放一个Container.但其内容如果本身就不是图片,只是容器,这种放入图片的做法会让包体变大。其实我们完全可以使用贝塞尔曲线进行切割。
主入口文件main.dart
import 'package:flutter/material.dart';import 'custom_clipper.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title:'Flutter Demo',debugShowCheckedModeBanner: false,theme:ThemeData(primarySwatch: Colors.blue,),home:HomePage());}}
ClipPath 路径裁切控件
clipPath控件可以把其内部的子控件切割,它有两个主要属性(参数):
- child :要切割的元素,可以是容器,图片
- clipper : 切割的路径,这个要和CustomClipper对象配合使用。
- (new) ClipPath ClipPath({Key key, CustomClipper
clipper, Clip clipBehavior = Clip.antiAlias, Widget child})
在Scaffold里放置了一个列容器,然后把ClipPath控件放到了里边,ClipPath的子元素是一个容器控件Container。BootomClipper是我们自定义的一个对象,里边主要就是切割的路径。import 'package:flutter/material.dart';class HomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(body:Column(children: <Widget>[ClipPath(clipper:BottomClipper(),child: Container(color:Colors.deepPurpleAccent,height: 200.0,),)],));}}
CustomClipper 裁切路径
我们主要的贝塞尔曲线路径就写在getClip方法里,它返回一段路径。
一个二阶的贝塞尔曲线是需要控制点和终点的,控制点就像一块磁铁,把直线吸引过去,形成一个完美的弧度,这个弧度就是贝塞尔曲线了。
我们先来熟悉一下裁切路径和贝塞尔曲线,作一个最简单的贝塞尔曲线出来。
全部代码如下:
import 'package:flutter/material.dart';class HomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(body:Column(children: <Widget>[ClipPath(clipper:BottomClipperTest(),child: Container(color:Colors.deepPurpleAccent,height: 200.0,),)],));}}class BottomClipperTest extends CustomClipper<Path>{@overridePath getClip(Size size) {var path = Path();path.lineTo(0, 0);path.lineTo(0, size.height-30);var firstControlPoint =Offset(size.width/2,size.height);var firstEndPoint = Offset(size.width,size.height-30);path.quadraticBezierTo(firstControlPoint.dx, firstControlPoint.dy, firstEndPoint.dx, firstEndPoint.dy);path.lineTo(size.width, size.height-30);path.lineTo(size.width, 0);return path;}@overridebool shouldReclip(CustomClipper<Path> oldClipper) {return false;}}
