Флаттер: Криволинейный клипер с контейнером

#flutter

Вопрос:

Я пытаюсь изогнуть контейнер, используя этот код:

 class CurveClipper extends CustomClipper<Path> {
  @override
  Path getClip(Size size) {
    int curveHeight = 40;
    Offset controlPoint = Offset(size.width / 2, size.height   curveHeight);
    Offset endPoint = Offset(size.width, size.height - curveHeight);

    Path path = Path()
      ..lineTo(0, size.height - curveHeight)
      ..quadraticBezierTo(controlPoint.dx, controlPoint.dy, endPoint.dx, endPoint.dy)
      ..lineTo(size.width, 0)
      ..close();

    return path;
  }

  @override
  bool shouldReclip(CustomClipper<Path> oldClipper) => false;
}
 

Использование:

 Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        // The title text which will be shown on the action bar
        title: Text(title),
      ),
      body: Container(
        child: ClipPath(
          clipper: CurveClipper(),
          child: Container(
            color: Colors.red,
            height: 200.0,
          ),
        ),
      ),
    );
  }
 

Тем не менее, это приводит меня к следующему:
Скриншот

Но я хочу, чтобы кривая была вверху контейнера, а не внизу. Как я могу этого достичь?

Комментарии:

1. » Но я хочу, чтобы кривая была вверху, а не внизу. Как я могу этого достичь?» — красная кривая с вашего изображения вверху

2. кривая @pskink внизу, там есть изображение.

3. @pskink, на изображении, которое я опубликовал, есть изогнутый контейнер, но в нижней части контейнера, а не в верхней части контейнера , как я хочу

4. верхняя часть контейнера , а не верхняя часть страницы

5. Ваша логика пути неверна.

Ответ №1:

Эта работа для меня
Файл с вырезкой

 Container(
        margin: EdgeInsets.only(left: 15, right: 15),
        alignment: Alignment.center,
        child: ClipPath(
          clipper: ClipPathClass(),
          child: SizedBox(
            width: 320,
            height: 240,
            child: Container(
              color: Colors.red,
            ),
          ),
        ),
      ),
 

Файл ClipPathClass

     class ClipPathClass extends CustomClipper<Path> {
    @override
    Path getClip(Size size) {
    var path = Path();
    path.moveTo(0.0, size.height - (size.height * 6 / 8));

    var secondControlPoint = Offset(size.width / 2, 0);
    var secondPoint = Offset(size.width, size.height - (size.height * 6 / 8));
    path.quadraticBezierTo(secondControlPoint.dx, secondControlPoint.dy,
    secondPoint.dx, secondPoint.dy);

   path.lineTo(size.width, size.height);
   path.lineTo(0, size.height);

   path.close();
   return path;
   }

   @override
   bool shouldReclip(CustomClipper<Path> oldClipper) => true;
   }
 

Это скриншот вывода