Flutter 仿闲鱼底部NavigationBar凸起

c777f84bf5fde7a1b8a75862d3bf113d.jpeg

这个圆的两侧圆弧边框明显是做了处理的,可能是ui给的一个整体图
我在想能否用代码实现,于是乎分析了一下


闲鱼.png

看箭头处,明显是有了两个不规则三角圆弧,这个怎么实现呢 ?
我第一个想法就是画一个三角形,然后斜线使用贝赛曲线来实现,似乎就是圆角的效果?


image.png

效果似乎不错,后面发现高度似乎太高了,又调整了一下
image.png

看着还不错,然后做了一个叠加效果对比,调了一个多小时,还是弄不到很自然的效果。
然后继续调,把底部宽度缩小一半,效果看着似乎不错
image.png


然后放到闲鱼的图比较一下,似乎可以


image.png

至于右侧,只要翻转一下就可以了,最终效果
image.png

实现代码,首先是CustomPainter,曲线使用quadraticBezierTo实现,这里原本是

quadraticBezierTo( size.width * 0.5, size.height*0.5, size.width,0),后面发现高度不需要改变,改成如下
quadraticBezierTo( size.width * 0.5, size.height, size.width,0)

import 'package:flutter/material.dart';

class SPainter extends CustomPainter {
  final Color fillColor;

  SPainter({
    this.fillColor = Colors.blue,
  });

  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint()
      ..color = fillColor
      ..style = PaintingStyle.fill;

    final path = Path()
      ..moveTo(0, size.height) // 起点:左下角
      ..quadraticBezierTo(
        size.width * 0.5, // 控制点 x(可调整)
        size.height, // 控制点 y(可调整)
        size.width, // 终点:右上角
        0,
      )
     // 原本底部长度是整个 宽度 ..lineTo(size.width, size.height) ,后面改成一半
      ..lineTo(size.width/2, size.height) // 底线:右下角
      ..close(); // 闭合路径(回到左下角)

    canvas.drawPath(path, paint);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false;
  }
}

预览

Center(
          child: CustomPaint(
            size: Size(80, 25), // 自定义大小
            painter: SPainter(fillColor: Colors.blue),
          ),
        ),

看看对比图,上方是没有加自定义圆弧的,过度得不是很自然,下方就是类似闲鱼的效果,图片截图被压缩了,看起来有点模糊,实际运行起来是没有问题的


image.png

完整代码,待续...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容