热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

想要仅在CustomClipper边框上添加高程,而不是下面的整个材质

我正在尝试通过使用Material的高程在自定义路径上添加高程,但是好像没有

我正在尝试通过使用Material的高程在自定义路径上添加高程,但是好像没有做
任何事情,我都尝试过其他方法,但是整个材料(矩形)都得到了提升。

import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedmodeBanner: false,home: HomeScreen(),);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.pink[300],body: Column(
children: [
TopContainer(),],));
}
}
class TopContainer extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ClipPath(
clipper: Imageclipper(),child: Material(
elevation: 15.0,child: Container(
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,image: NetworkImage(
'https://images.pexels.com/photos/3309467/pexels-photo-3309467.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260',),constraints: BoxConstraints.expand(
width: double.infinity,height: MediaQuery.of(context).size.height * 0.5,));
}
}
class Imageclipper extends CustomClipper {
@override
Path getclip(Size size) {
var path = Path();
path.lineTo(0.0,size.height);
var firstCOntrolPoint= Offset(size.width * 0.35,size.height * 0.75);
var firstEndPoint = Offset(size.width * 0.65,size.height * 0.85);
path.quadraticBezierTo(firstControlPoint.dx,firstControlPoint.dy,firstEndPoint.dx,firstEndPoint.dy);
///////////////////////////////////////////////
var secOndControlPoint= Offset(size.width * 0.85,size.height * 0.90);
var secOndEndPoint= Offset(size.width,size.height * 0.75);
path.quadraticBezierTo(secondControlPoint.dx,secondControlPoint.dy,secondEndPoint.dx,secondEndPoint.dy);
// path.lineTo(size.width,size.height * 0.9);
path.lineTo(size.width,0.0);
path.close();
return path;
}
@override
bool shouldReclip(CustomClipper oldClipper) {
return false;
}
}

我正在尝试通过使用Material的高程在自定义路径上添加高程,但是似乎什么也没做,我尝试了其他方法,但在整个材料(矩形)上获得了高程。

想要仅在CustomClipper <Path>边框上添加高程,而不是下面的整个材质


使用该自定义ShapeBorder

class WaveShapeBorder extends ShapeBorder {
@override EdgeInsetsGeometry get dimensiOns=> EdgeInsets.zero;
@override ui.Path getInnerPath(ui.Rect rect,{ui.TextDirection textDirection}) => null;
@override
ui.Path getOuterPath(ui.Rect rect,{ui.TextDirection textDirection}) {
var ctrl1 = FractionalOffset(0.35,0.75).withinRect(rect);
var end1 = FractionalOffset(0.65,0.85).withinRect(rect);
var ctrl2 = FractionalOffset(0.85,0.90).withinRect(rect);
var end2 = FractionalOffset(1.0,0.75).withinRect(rect);
return Path()
..moveTo(rect.topLeft.dx,rect.topLeft.dy)
..lineTo(rect.bottomLeft.dx,rect.bottomLeft.dy)
..quadraticBezierTo(ctrl1.dx,ctrl1.dy,end1.dx,end1.dy)
..quadraticBezierTo(ctrl2.dx,ctrl2.dy,end2.dx,end2.dy)
..lineTo(rect.topRight.dx,rect.topRight.dy)
..close();
}
@override void paint(ui.Canvas canvas,ui.Rect rect,{ui.TextDirection textDirection}) {}
@override ShapeBorder scale(double t) => this;
}

和此示例代码进行测试:

class WaveShapeBorderTest extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.teal,Colors.green],begin: Alignment.topRight,end: Alignment.centerLeft,),child: Stack(
children: [
Material(
elevation: 6,shape: WaveShapeBorder(),clipBehavior: Clip.antiAlias,child: Image.asset('images/someImage.png'),],);
}
}

当然,您可以自由使用它,但是主要思想是使用Material.shapeMaterial.clipBehavior属性

这是最终结果:

enter image description here

编辑,如果您认为阴影太“浅”,则可以使用自定义阴影添加另外一个Container

class WaveShapeBorderTest extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.teal,child: Stack(
children: [
Container(
decoration: ShapeDecoration(
shape: WaveShapeBorder(),shadows: [
BoxShadow(color: Colors.black,blurRadius: 16,offset: Offset(2,2),spreadRadius: 8),]
),child: Material(
clipBehavior: Clip.antiAlias,child: Image.asset('images/someImage.png',Icon(Icons.photo,size: 64,);
}
}

您将看到:

enter image description here


推荐阅读
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 开发笔记:深入解析Android自定义控件——Button的72种变形技巧
    开发笔记:深入解析Android自定义控件——Button的72种变形技巧 ... [详细]
  • 本文探讨了在Android应用中实现动态滚动文本显示控件的优化方法。通过详细分析焦点管理机制,特别是通过设置返回值为`true`来确保焦点不会被其他控件抢占,从而提升滚动文本的流畅性和用户体验。具体实现中,对`MarqueeText.java`进行了代码层面的优化,增强了控件的稳定性和兼容性。 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • Linux系统防火墙启用与端口开放详细指南及操作流程
    在Linux系统中,启用防火墙并开放特定端口是确保网络安全的重要步骤。本文详细介绍了防火墙的配置方法和操作流程,包括如何解决在使用 `service iptables save` 命令时遇到的常见问题,如命令不支持基本的LSB动作(启动、停止等)的情况。此外,还提供了多种解决方案和最佳实践,帮助用户高效地管理和维护系统安全。 ... [详细]
  • 在Python中,是否可以通过使用Tkinter或ttk库创建一个具有自动换行功能的多行标签,并使其宽度能够随着父容器的变化而动态调整?例如,在调整NotePad窗口宽度时,实现类似记事本的自动换行效果。这种功能在设计需要显示长文本的对话框时非常有用,确保文本内容能够完整且美观地展示。 ... [详细]
  • 本文详细解析了LeetCode第215题,即高效寻找数组中前K个最大元素的问题。通过使用快速选择算法(partition),可以在平均时间复杂度为O(N)的情况下完成任务。本文不仅提供了算法的具体实现步骤,还深入探讨了partition算法的工作原理及其在不同场景下的应用,帮助读者更好地理解和掌握这一高效算法。 ... [详细]
  • 本次发布的Qt音乐播放器2.0版本在用户界面方面进行了细致优化,提升了整体的视觉效果和用户体验。尽管核心功能与1.0版本保持一致,但界面的改进使得操作更加直观便捷,为用户带来了更为流畅的使用体验。此外,我们还对部分细节进行了微调,以确保软件的稳定性和性能得到进一步提升。 ... [详细]
  • 在高清节目的高比特率传输过程中,使用外接USB硬盘进行时间平移(timeshift)时,出现了性能不足和流数据丢失的问题。通过深入研究,我们发现通过对图像组(GOP)和图像头(I-frame)的精确定位技术进行优化,可以显著提升系统的性能和稳定性。本研究提出了改进的图像组与图像头定位算法,有效减少了数据丢失,提高了流媒体传输的效率和质量。 ... [详细]
  • 本文深入探讨了 `ExpressionChangedAfterItHasBeenCheckedError` 错误的原因及其解决方案。通过分析 Angular 的变更检测机制,详细解释了该错误的发生条件,并提供了多种有效的应对策略,帮助开发者在实际开发中避免这一常见问题。 ... [详细]
author-avatar
kitty2702935423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有