Jetpack Compose 互操作性问题:AndroidView嵌入的按钮缺失elevation阴影
问题原因
- 你传入
MaterialButton的上下文默认是Compose所在页面的上下文,如果该上下文未继承MaterialComponents系列主题,Material相关组件的阴影、样式都会丢失。 - Android View的elevation阴影是绘制在控件自身尺寸范围之外的,
AndroidView默认开启了内容裁剪,超出控件范围的阴影会被直接裁剪掉。
解决方案
你只需要调整两处代码即可保留阴影效果,自定义按钮也可以复用这套逻辑:
- 给按钮套一层带MaterialComponents主题的上下文,不要直接用factory传入的默认context
- 给
AndroidView关闭内容裁剪,允许阴影绘制在控件范围外
修改后的示例代码如下:
AndroidView( factory = { context -> // ContextThemeWrapper的第二个参数替换为你应用中继承自MaterialComponents的主题id MaterialButton(ContextThemeWrapper(context, R.style.Theme_YourApp_Material)).apply { text = "Hello" // 可手动指定elevation数值,单位为px,也可以在自定义View的逻辑里设置 elevation = 8f * resources.displayMetrics.density } }, modifier = Modifier .padding(16.dp) // 关闭AndroidView的默认裁剪,允许阴影展示 .clipToBounds(false) )
补充说明
如果调整后还是看不到阴影,检查AndroidView的上层父布局是否开启了clipToPadding或clipToBounds,如果是的话需要对应关闭外层的裁剪属性,或者给外层布局增加足够的padding预留阴影展示空间。
内容的提问来源于stack exchange,提问作者oldu
相关产品推荐
相关产品推荐

