让我们实现一个更好看的内部阴影按钮

关键代码

js 复制代码
  @override
  void paint(Canvas canvas, Size size) {
    var rect = RRect.fromLTRBR(0, 0, size.width, size.height,Radius.circular(20));

    canvas.save();
    var topLeftPath = Path()..addRRect(RRect.fromLTRBR(0, 0, size.width * 9/ 10 , size.height * 9/ 10 ,Radius.circular(20)).shift(Offset(-5, -5)));
    var topLeftPainter = Paint()
      ..color = Colors.white.withValues(alpha: 0.8)
      ..maskFilter = MaskFilter.blur(
          BlurStyle.normal, 10
      );
    canvas.drawPath(topLeftPath, topLeftPainter);

    var bottomRightPath = Path()..addRRect(RRect.fromLTRBR(size.width / 10, size.height / 10, size.width  , size.height ,Radius.circular(20)).shift(Offset(5, 5)));
    var bottomRightPainter = Paint()
      ..color = Colors.black.withValues(alpha: 0.8)
      ..maskFilter = MaskFilter.blur(
          BlurStyle.normal, 10
      );
    canvas.drawPath(bottomRightPath, bottomRightPainter);
    canvas.restore();

    var contentPath = Path()..addRRect(rect);

    var contentPainter = Paint()
      ..color = Colors.grey;
    canvas.drawPath(contentPath, contentPainter);


    canvas.save();
    var topLeftInnerPath = Path()..addRRect(RRect.fromLTRBR(0, 0, size.width , size.height ,Radius.circular(20)).shift(Offset(-size.width * 1 /4, -size.height  * 1/4)));
    canvas.clipRRect(rect.deflate(2));
    var topLeftInnerPainter = Paint()
      ..color = Colors.black.withAlpha(100)
      ..maskFilter = MaskFilter.blur(
          BlurStyle.normal, 30
      );

    canvas.drawPath(topLeftInnerPath, topLeftInnerPainter);

    var bottomRightInnerPath = Path()..addRRect(RRect.fromLTRBR(0, 0, size.width , size.height ,Radius.circular(20)).shift(Offset(size.width * 1 /4, size.height  * 1/4)));
    canvas.clipRRect(rect);
    var bottomRightInnerPainter = Paint()
      ..color = Colors.white.withAlpha(100)
      ..maskFilter = MaskFilter.blur(
          BlurStyle.normal, 30
      );
    canvas.drawPath(bottomRightInnerPath, bottomRightInnerPainter);

    canvas.restore();

  }
相关推荐
DogDaoDao20 小时前
Android 硬件编码器参数完全指南:MediaCodec 深度解析
android·音视频·视频编解码·h264·硬编码·视频直播·mediacodec
JohnnyDeng9421 小时前
Android 自定义 View:Canvas 绘图与事件分发深度解析
android
Android小码家1 天前
Framework之Launcher小窗开发
android·framework·虚拟屏·小窗
赏金术士1 天前
第七章:状态管理实战与架构总结
android·ui·kotlin·compose
颂love1 天前
MySQL的执行流程
android·数据库·mysql
leazer1 天前
Flutter Windows 构建失败:.plugin_symlinks 符号链接异常的排查与修复
windows·flutter
云起SAAS1 天前
抖音小游戏源码 - 消消乐 | 含激励广告+成就系统 | 开箱即用商业级消除游戏模板
android·游戏·广告联盟·看激励广告联盟流量主·抖音小游戏源码 - 消消乐
大貔貅喝啤酒1 天前
基于Windows下载安装Android Studio 3.3.2版本教程(2026详细图文版)
android·java·windows·android studio
程序员码歌1 天前
OpenSpec 到 Superpowers:AI 编码从说清到做对
android·前端·人工智能
2501_915106321 天前
深入解析无源码iOS加固原理与方案,保护应用安全
android·安全·ios·小程序·uni-app·cocoa·iphone