如何让Material Button不预留阴影空间且保留按钮交互效果?
核心问题是MaterialButton默认会通过inset属性为阴影预留额外空间,这就是UI查看器中看到的红色轮廓边距。要消除这个预留同时保留点击波纹等交互,直接通过代码将所有inset设为0即可,无需修改背景或禁用状态动画。
实现步骤
MaterialButton提供了直接设置inset的API,在动态创建按钮时添加以下操作:
- 将
InsetLeft、InsetRight、InsetTop、InsetBottom全部设为0,彻底移除阴影预留空间 - 该操作不会影响按钮的点击波纹、状态变化等交互特性
修改后的完整示例代码
MaterialButton nativeView = new MaterialButton(ctx, null, Resource.Attribute.materialButtonStyle); int id = View.GenerateViewId(); nativeView.Id = id; ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent); nativeView.LayoutParameters = layoutParams; nativeView.SetPadding(0, 0, 0, 0); // 关键代码:移除阴影预留的inset空间 nativeView.InsetLeft = 0; nativeView.InsetRight = 0; nativeView.InsetTop = 0; nativeView.InsetBottom = 0; nativeView.SetAllCaps(false); nativeView.CornerRadius = (int)Math.Round(wdg.Curve * 2.22, MidpointRounding.AwayFromZero); nativeView.StrokeWidth = 2; base.ApplyFontSettings(wdg.FontInfo, nativeView); nativeView.StrokeColor = ColorStateList.ValueOf(wdg.BorderColor.Value.ToAndroidColor()); nativeView.SetBackgroundColor(wdg.FillColor.Value.ToAndroidColor()); nativeView.SetTextColor(wdg.ForeColor.Value.ToAndroidColor());
原理说明
默认的materialButtonStyle中定义了android:insetLeft、android:insetTop等属性(默认值通常为4dp),这些inset是专门为阴影效果预留的外部空间。通过代码将其设为0后,按钮的实际显示尺寸就会与TextView一致,同时完全保留原有的交互视觉反馈(点击波纹、状态切换动画等)。
内容的提问来源于stack exchange,提问作者tcarvin
相关产品推荐
相关产品推荐

