android 防止按钮/材质按钮在布局中为阴影保留空间

vlju58qv  于 2023-01-03  发布在  Android
关注(0)|答案(1)|浏览(164)

参见随附的屏幕截图。

红色文本视图(添加用于调试目的)和三个材料设计蓝色按钮都使用相同的垂直约束布局设置进行设置,但蓝色按钮较小。我添加红色字段只是为了查看约束布局是否会造成混乱。使用UI查看器,我可以看到控件实际上与预期大小相同,但是蓝色按钮上有一个空白(红色轮廓来自工具)。经过实验和研究,我发现这似乎是由于支持按钮周围阴影的可能性。这似乎也适用于普通按钮,正如我在演示中也添加了按钮一样,右下角的"Button1"也表现出了同样的行为。我读到改变背景可以取消这种行为,在另外两个Peach "Button1"视图中这样做就去掉了边距,而且使它们在视觉上对触摸交互没有React(点击它们不会产生"涟漪")。沿着消除阴影的道路走下去,我尝试将StateListAnimator设置为null,我试过将OutlineProvider设置为null和custom class,我也试过将elevation和TranslationZ设置为-(都是基于不同的SO文章)。这些似乎都没有释放保留的边距,同时仍然让按钮在被点击时视觉上像按钮一样。
关于如何编程设置一个材质设计按钮,使其不保留阴影空间,并且仍然像一个按钮一样工作,有什么提示吗?
背景:

  • Xamarin Android(Xamarin Native,而不是Xamarin Forms)。不要让它阻止你告诉我如何用非Xamarin C#的方式做它,如果需要的话,我会把它翻译回来。
  • 屏幕是动态驱动的(因此,通过代码创建而不是布局)

示例代码(修整管道),尽管这实际上主要是添加用户指定的视觉设置:

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);
        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());
nukf8bse

nukf8bse1#

一个不完美的解决方案。我已经创建了一个样本来测试它。
一开始我尝试在xml中设置style="?android:attr/borderlessButtonStyle",但是没有成功,后来我尝试在xml中设置边距,比如:

android:layout_marginTop="-7dp"
android:layout_marginBottom="-7dp"

LinearLayout和ConstraintLayout都会覆盖按钮的阴影空间,所以我尝试通过编程来设置它:

MaterialButton button = this.FindViewById<MaterialButton>(Resource.Id.button1);
LinearLayout.LayoutParams layout = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MatchParent, LinearLayout.LayoutParams.WrapContent);
layout.SetMargins(0, -16, 0, -16);
button.LayoutParameters = layout;

在xml中,它应该是-7,在后面的代码中,它应该是-16。这在LinearLayout中可以工作,但当我将LinearLayout更改为ConstraintLayout时,它不工作。因此,您可以将按钮放在LinearLayout中,而不是ConstraintLayout中。

相关问题