在 Flutter 中创建具有水平直线的自定义剪辑路径

问题描述 投票:0回答:1

问题: 我目前正在使用

CustomClipper<Path>
在 Flutter 中实现自定义剪辑路径,但我面临的问题是形状中的水平线没有呈现完全笔直。以下是问题的详细描述以及我迄今为止所尝试的方法:

问题描述:

我开发了一个

CustomClipPath
类来使用
Path
命令(例如
moveTo
lineTo
)定义自定义形状。该形状包括勾勒其形状的水平线和垂直线。然而,在渲染形状时,我观察到水平线显示轻微的对角线段,而不是在屏幕宽度上保持直线路径。

我尝试过的:

我构造了

CustomClipPath
类来使用各种
Path
命令指定形状,调整
lineTo
内的坐标以准确定位形状的顶点。

我的期望:

我预计

CustomClipPath
会渲染出一个形状,其水平线完全笔直,水平线均匀地延伸到屏幕宽度上,遵循
Path
中定义的比例。

实际结果:

渲染后,形状内的水平线表现出较小的对角线偏差,而不是保持完全笔直。

图片

img

代码示例:

import 'package:flutter/material.dart';

class CustomClipPath extends CustomClipper<Path> {
  @override
  Path getClip(Size size) {
    Path path = Path();

    path.moveTo(0, size.height * 0.30);
    path.lineTo(size.width * 0.10, size.height * 0.20);
    path.lineTo(0, size.height * 0.10);
    path.lineTo(size.width, 0);
    path.lineTo(size.width, size.height);
    path.lineTo(0, size.height);
    path.lineTo(size.width * 0.10, size.height * 0.90);
    path.lineTo(0, size.height * 0.80);
    path.lineTo(0, size.height);

    path.close();
    return path;
  }

  @override
  bool shouldReclip(covariant CustomClipper<Path> oldClipper) {
    return false;
  }
}

class ClipPathExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ClipPath(
      clipper: CustomClipPath(),
      child: Container(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height,
        color: Colors.blue, // Example background color
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: Text('Custom Clip Path Issue'),
      ),
      body: ClipPathExample(),
    ),
  ));
}

实际任务:

我的目标是实现类似于所需结果的剪辑路径,其中水平线在屏幕宽度上完全笔直。

图片

img

其他详细信息:

  • 设备/模拟器: Flutter 桌面、Web、移动设备

所做的尝试:

我在

CustomClipper<Path>
类中尝试了不同的坐标和比例,以准确对齐水平线。尽管做了这些调整,我还是没能达到想要的直线效果。

我正在寻求有关如何有效修改我的

CustomClipper<Path>
实现的建议和见解,以确保水平线按预期呈现完全笔直。任何指导或建议将不胜感激。谢谢您的协助!


flutter responsive-design clipper customclipper
1个回答
0
投票

尝试以下路径,然后调整值以匹配所需的结果:

  @override
  Path getClip(Size size) {

    double width = size.width;
    double height = size.height;
    Path path = Path();

    path.lineTo(0.05*w , 0);
    path.lineTo(0.1*w , 0.1*h);
    path.lineTo(0.05*w , 0.1*h);
    path.lineTo(0.05*w , 0.9*h);
    path.lineTo(0.1*w , 0.9*h);
    path.lineTo(0.05*w , h);
    path.lineTo(w , h);
    path.lineTo(w , 0);

    path.close();
    return path;
  }

注意:该表格的左侧剪裁(白色区域)约为(宽度的.0.5)。

© www.soinside.com 2019 - 2024. All rights reserved.