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以下的版本,可以通过以下方式实现:
- 先创建基础的圆角白色背景
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>
- 在代码中通过
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
相关产品推荐
相关产品推荐

