【flutter】同时实现Container内阴影与外阴影

效果图:

思路:

1. 首先把背景用阴影色填充。

Container(
  width: 63,
  height: 63,
  decoration: const BoxDecoration(
    color: Color(0xFFE8E8E8),
    shape: BoxShape.circle,
  ),
),

2. 然后实现外阴影。

 

Container(
  width: 63,
  height: 63,
  decoration: const BoxDecoration(
    color: Color(0xFFE8E8E8),
    shape: BoxShape.circle,
    boxShadow: [
      BoxShadow(
        color: Color(0xFFE8E8E8),
        offset: Offset(8, 8),
        blurRadius: 10,
        spreadRadius: 1,
      ),
    ],
  ),
),

3. 关键步骤,叠加一层原来背景色的阴影

由于叠加的阴影有向右下方的偏移,露出的背景构成了内阴影。

这里的模糊半径使得内阴影附带了模糊,但外阴影的轮廓也模糊了(下面解决)。

Stack(
  alignment: AlignmentDirectional.center,
  children: [
    Container(
      width: 63,
      height: 63,
      decoration: const BoxDecoration(
        color: Color(0xFFE8E8E8),
        shape: BoxShape.circle,
        boxShadow: [
          BoxShadow(
            color: Color(0xFFE8E8E8),
            offset: Offset(8, 8),
            blurRadius: 10,
            spreadRadius: 1,
          ),
        ],
      ),
    ),
      Container(
      width: 63,
      height: 63,
      decoration: const BoxDecoration(
        shape: BoxShape.circle,
        boxShadow: [
          BoxShadow(
            color: Color(0xFFF7F7F7),
            offset: Offset(3, 3),
            blurRadius: 3,
            spreadRadius: 1,
          ),
        ],
      ),
    ),
  ],
),

最后加入裁切,解决外阴影边缘模糊的问题。

只要把第3步中多余的阴影裁掉即可,ClipRRect裁切掉右下溢出的多余阴影,形成锐利的边缘。

完整代码:

Stack(
  alignment: AlignmentDirectional.center,
  children: [
    Container(
      width: 63,
      height: 63,
      decoration: const BoxDecoration(
        color: Color(0xFFE8E8E8),
        shape: BoxShape.circle,
        boxShadow: [
          BoxShadow(
            color: Color(0xFFE8E8E8),
            offset: Offset(8, 8),
            blurRadius: 10,
            spreadRadius: 1,
          ),
        ],
      ),
    ),
    ClipRRect(
      borderRadius: BorderRadius.circular(63),
      child: Container(
        width: 63,
        height: 63,
        decoration: const BoxDecoration(
          shape: BoxShape.circle,
          boxShadow: [
            BoxShadow(
              color: Color(0xFFF7F7F7),
              offset: Offset(3, 3),
              blurRadius: 3,
              spreadRadius: 1,
            ),
          ],
        ),
      ),
    ),
  ],
),

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值