You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android:创建带模糊效果与12dp圆角的Drawable背景

解决Android带模糊效果+12dp圆角的背景Drawable问题

你的代码无法实现预期效果的原因:

  • 用多层纯色shape叠加只能模拟生硬的阴影,无法实现真正的模糊效果
  • 层级结构错误,最后一层白色shape完全覆盖了前面的阴影层,导致阴影无法正常显示

以下是两种可行的实现方案:

方案一:Android 12+原生模糊实现(推荐)

从API 31开始,Android支持在Drawable中直接使用BlurEffect,可以轻松实现模糊阴影+圆角效果:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 模糊阴影层:设置偏移量和模糊半径 -->
    <item
        android:bottom="4dp"
        android:left="4dp"
        android:right="4dp"
        android:top="4dp">
        <shape android:shape="rectangle">
            <corners android:radius="12dp" />
            <!-- 低透明度黑色作为模糊基底,数值可根据需求调整 -->
            <solid android:color="#1F000000" />
            <effect>
                <!-- 模糊半径,值越大模糊效果越强 -->
                <blur android:radius="8dp" android:edgeTreatment="solid" />
            </effect>
        </shape>
    </item>
    <!-- 白色圆角背景层 -->
    <item>
        <shape android:shape="rectangle">
            <corners android:radius="12dp" />
            <solid android:color="@android:color/white" />
        </shape>
    </item>
</layer-list>

方案二:兼容低版本的实现方式

如果需要适配Android 12以下的版本,可以通过以下方式实现:

  1. 先创建基础的圆角白色背景bg_white_round.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@android:color/white" />
    <corners android:radius="12dp" />
</shape>
  1. 在代码中通过RenderScript生成模糊阴影,同时给View设置圆角:
// 扩展函数:dp转px
fun Int.dpToPx(): Int {
    return (this * Resources.getSystem().displayMetrics.density).toInt()
}

// 设置View圆角
view.outlineProvider = object : ViewOutlineProvider() {
    override fun getOutline(view: View, outline: Outline) {
        outline.setRoundRect(0, 0, view.width, view.height, 12.dpToPx())
    }
}
view.clipToOutline = true

// 生成模糊背景
fun createBlurDrawable(context: Context, color: Int, blurRadius: Int): Drawable {
    val rs = RenderScript.create(context)
    val bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888).apply {
        eraseColor(color)
    }
    val allocation = Allocation.createFromBitmap(rs, bitmap)
    val blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs))
    blurScript.setRadius(blurRadius.toFloat())
    blurScript.setInput(allocation)
    blurScript.forEach(allocation)
    allocation.copyTo(bitmap)
    rs.destroy()
    return BitmapDrawable(context.resources, bitmap).apply {
        setFilterBitmap(true)
    }
}

// 组合模糊阴影和白色背景
view.background = LayerDrawable(arrayOf(
    createBlurDrawable(this, Color.parseColor("#1F000000"), 8),
    ContextCompat.getDrawable(this, R.drawable.bg_white_round)
)).apply {
    setLayerInset(0, 4.dpToPx(), 4.dpToPx(), 4.dpToPx(), 4.dpToPx())
}

内容的提问来源于stack exchange,提问作者Jin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:00:07