finnershadow.dart 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import 'dart:ui';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/rendering.dart';
  4. import 'fdefine.dart';
  5. class FInnerShadow extends SingleChildRenderObjectWidget {
  6. final double blur;
  7. final Color color;
  8. final Offset offset;
  9. FInnerShadow({
  10. Key key,
  11. this.blur = 10,
  12. this.color = FInnerShadowColor,
  13. this.offset = FInnerShadowOffset,
  14. Widget child,
  15. }) : super(key: key, child: child);
  16. @override
  17. RenderObject createRenderObject(BuildContext context) {
  18. final _ZenUIRenderInnerShadow renderObject = _ZenUIRenderInnerShadow();
  19. updateRenderObject(context, renderObject);
  20. return renderObject;
  21. }
  22. @override
  23. void updateRenderObject(
  24. BuildContext context, _ZenUIRenderInnerShadow renderObject) {
  25. renderObject
  26. ..color = color
  27. ..blur = blur
  28. ..dx = offset.dx
  29. ..dy = offset.dy;
  30. }
  31. }
  32. class _ZenUIRenderInnerShadow extends RenderProxyBox {
  33. double blur;
  34. Color color;
  35. double dx;
  36. double dy;
  37. @override
  38. void paint(PaintingContext context, Offset offset) {
  39. if (child == null) return;
  40. final Rect rectOuter = offset & size;
  41. final Rect rectInner = Rect.fromLTWH(
  42. offset.dx,
  43. offset.dy,
  44. size.width,
  45. size.height,
  46. );
  47. final Canvas canvas = context.canvas..saveLayer(rectOuter, Paint());
  48. context.paintChild(child, offset);
  49. Paint shadowPaint = Paint()
  50. ..blendMode = BlendMode.srcATop
  51. ..imageFilter = ImageFilter.blur(sigmaX: blur, sigmaY: blur)
  52. ..colorFilter = ColorFilter.mode(color, BlendMode.srcOut);
  53. canvas
  54. ..saveLayer(rectOuter, shadowPaint)
  55. ..saveLayer(rectInner, Paint())
  56. ..translate(dx, dy);
  57. context.paintChild(child, offset);
  58. context.canvas..restore()..restore()..restore();
  59. }
  60. }