这是内阴影的代码
首先创建一个此类
class InnerShadow extends SingleChildRenderObjectWidget {
const InnerShadow({
this.blur = 10,
this.color = Colors.black38,
this.offset = const Offset(10, 10),
required Widget child,
}) : super(child: child);
final double blur;
final Color color;
final Offset offset;
@override
RenderObject createRenderObject(BuildContext context) {
final _RenderInnerShadow renderObject = _RenderInnerShadow();
updateRenderObject(context, renderObject);
return renderObject;
}
@override
void updateRenderObject(
BuildContext context, _RenderInnerShadow renderObject) {
renderObject
..color = color
..blur = blur
..dx = offset.dx
..dy = offset.dy;
}
}
class _RenderInnerShadow extends RenderProxyBox {
late double blur;
late Color color;
late double dx;
late double dy;
@override
void paint(PaintingContext context, Offset offset) {
if (child == null) return;
final Rect rectOuter = offset & size;
final Rect rectInner = Rect.fromLTWH(
offset.dx,
offset.dy,
size.width - dx,
size.height - dy,
);
final Canvas canvas = context.canvas..saveLayer(rectOuter, Paint());
context.paintChild(child!, offset);
final Paint shadowPaint = Paint()
..blendMode = BlendMode.srcATop
..imageFilter = ImageFilter.blur(sigmaX: blur, sigmaY: blur)
..colorFilter = ColorFilter.mode(color, BlendMode.srcOut);
canvas
..saveLayer(rectOuter, shadowPaint)
..saveLayer(rectInner, Paint())
..translate(dx, dy);
context.paintChild(child!, offset);
context.canvas
..restore()
..restore()
..restore();
}
}
像这样使用InnerShadow类后
InnerShadow(
blur: 2,
offset: const Offset(-3, -8),
color: Colors.black12.withOpacity(0.2),
child: Container(
child: ClipRRect(
borderRadius: BorderRadius.circular(30.0),
child: Image.asset(
'assets/icons/abc.png',
fit: BoxFit.fill,
),
),
width: 30.h,
height: 30.h,
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.01),
borderRadius: const BorderRadius.all(Radius.circular(30)),
),
),
)
这是我的输出