flutter - 使用 getOuterPath 和 ShapeBorder 在 Card 周围颤动裁剪
问题描述
在flutter
我试图裁剪时Cart
,这个动作可以轻松完成吗?我找不到任何文档或黑客想法
当我们用CustomPainter
无法设置阴影创建这个小部件时,有没有人可以帮助我们解决这个问题?
提前致谢
解决方案
可能是这样的:
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
brightness: Brightness.light,
primarySwatch: Colors.blue,
scaffoldBackgroundColor: Colors.white,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Card(
shape: DurmaShape(
borderRadius: Radius.circular(20),
holeSize: 40,
offset: Offset(30, -30),
side: BorderSide(
color: Colors.black.withOpacity(0.5),
width: 1.0,
),
),
elevation: 7,
child: Container(
height: 200,
width: 280,
),
),
],
),
),
);
}
}
class DurmaShape extends ShapeBorder {
DurmaShape({
@required this.borderRadius,
@required this.holeSize,
this.offset = Offset.zero,
this.side = BorderSide.none,
});
final Radius borderRadius;
final Offset offset;
final BorderSide side;
@override
EdgeInsetsGeometry get dimensions => EdgeInsets.zero;
@override
void paint(Canvas canvas, Rect rect, {TextDirection textDirection}) {
if (side != BorderSide.none) {
canvas.drawPath(
_getPath(rect),
side.toPaint(),
);
}
}
Path _getPath(Rect rect) {
return Path.combine(
PathOperation.difference,
Path()
..addRRect(RRect.fromRectAndRadius(rect, borderRadius))
..close(),
Path()
..addOval(Rect.fromCircle(
center: Offset(0, rect.height) + offset,
radius: holeSize,
))
..close(),
);
}
@override
Path getInnerPath(Rect rect, {TextDirection textDirection}) => null;
final double holeSize;
@override
ui.Path getOuterPath(ui.Rect rect, {ui.TextDirection textDirection}) =>
_getPath(rect);
@override
ShapeBorder scale(double t) => this;
}
推荐阅读
- html - 如何在不改变其外观的情况下将我的代码中的 URL 文本转换为链接?
- python - Ajax在views.py django中发送数据两次
- python - 除非动作链运行两次,否则 Selenium 无法拖放(python)
- python - 使用 tkinter,如果使用 place() 方法,有没有办法隐藏许多小部件?
- html - 为什么导航高度不自动调整到其内容?
- go - 为什么我的 GitHub Actions 脚本找不到我的内部 go 包?
- laravel-sanctum - 用 Laravel Sanctum 中被盗的 cookie 重新认证
- javascript - 如何在Javascript中访问字典中的值
- python - 如何将数据框中的对象列更改为 Python 中的数字列?
- java - Java Lambda 函数在连接到 Informix DB 时超时