flutter - 如何制作本设计中的弯曲和有角度的容器?
解决方案
这是使用 ClipPath 的解决方案:
import 'dart:math';
import 'package:flutter/material.dart';
void main() {
runApp(
MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
home: Scaffold(
body: MyWidget(),
),
),
);
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: ClipPath(
child: Container(
color: Colors.red,
width: 300,
height: 400,
),
clipper: MyClipper(),
),
);
}
}
class MyClipper extends CustomClipper<Path> {
final double _borderRadius; // percentage of the shortest side
final double _angle;
MyClipper({
double borderRadius,
double angle,
}) : _borderRadius = borderRadius ?? .1,
_angle = angle ?? degToRad(80);
@override
Path getClip(Size size) {
final borderRadius = _borderRadius * size.shortestSide;
final dx = borderRadius * cos(_angle);
final dy = borderRadius * sin(_angle);
final dX = size.height / tan(_angle);
Path path = Path()
..moveTo(borderRadius, size.height)
..quadraticBezierTo(0, size.height, dx, size.height - dy)
..lineTo(dX - dx, dy)
..quadraticBezierTo(dX, 0, dX + borderRadius, 0)
..lineTo(size.width - borderRadius, 0)
..quadraticBezierTo(size.width, 0, size.width - dx, dy)
..lineTo(size.width - dX + dx, size.height - dy)
..quadraticBezierTo(size.width - dX, size.height,
size.width - dX - borderRadius, size.height)
..close();
return path;
}
@override
bool shouldReclip(CustomClipper<Path> oldClipper) => false;
}
num degToRad(num deg) => deg * (pi / 180.0);
关于变量的快速解释dx
,dy
和dX
:
推荐阅读
- qt - Qml的DropArea什么不能用?
- popup - wx.DrawRectangle 上的 wxPython 弹出窗口/工具提示?
- sass - 如何修复 gulp watch 不看文件
- javascript - 如何解决这个 javascript switch 语句问题,switch 语句不起作用
- javascript - 在滚动和屏幕宽度上更改导航栏颜色
- docker - Heroku 上的“没有为进程类型 web 指定命令”
- java - doNothing.When 对于私有 void 方法本身正在调用方法
- r - 在 R 中使用 msSurv 包
- command-line-interface - 当 Spinnaker auth 为 SAML 时的 Spinnaker CLI
- python - pytest 获取当前测试文件的文件路径