布局背景未根据 BottomSheet 布局中的可绘制背景进行裁剪

Posted

技术标签:

【中文标题】布局背景未根据 BottomSheet 布局中的可绘制背景进行裁剪【英文标题】:Layout background is not clipped according to background drawable in BottomSheet layout 【发布时间】:2019-11-14 02:55:53 【问题描述】:

我想制作带有圆角的 BottomSheet 的布局,但设置一个带有圆角半径的可绘制对象不会裁剪布局背景。 我正在使用BottomSheetDialogFragment

fragment_a.xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:background="@drawable/round_rectangle">
   <!-- other views here -->
</androidx.constraintlayout.widget.ConstraintLayout>

round_rectangle.xml

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"   >
    <solid
        android:color="@android:color/white" />
    <stroke
        android:
        android:color="#C4CDE0" />
    <padding
        android:left="0dp"
        android:right="0dp"
        android:top="0dp"
        android:bottom="0dp" />
    <corners
        android:topLeftRadius="16dp"
        android:topRightRadius="16dp" />
</shape>

当前结果:

试过了:

使用编程方式剪辑

view.clipToOutline = true

请帮忙!提前致谢!

【问题讨论】:

至少对我来说,这个问题还不清楚。期望的结果是什么? 我想去掉灰色圆形边框外的白色背景。 现有背景没有被drawable裁剪 我猜这是不可能自动获得的。你应该在你的drawable中模拟效果。现有背景的颜色是什么。是你定义的吗? 您可以在不定义背景可绘制对象的情况下添加圆角。检查这个post 【参考方案1】:

圆角的颜色来自底部工作表容器的颜色。要确定如何制作透明角,我们需要检查布局。布局检查器确定了我们感兴趣的关键组件:底部工作表本身 (id/bottomSheet) 及其框架 (id/design_bottom_sheet)。

我们需要将底部工作表框架的背景颜色 id/design_bottom_sheet 更改为透明以获得圆角。

一旦框架可用,就很容易找到框架。一旦创建了对话框并且片段的创建已经足够远,设置框架背景的一个地方就是您的自定义 BottomSheetDialogFragment 的onActivityCreated()。在片段生命周期的这一点上,视图层次结构被实例化。

@Override
public void onActivityCreated(Bundle bundle) 
    super.onActivityCreated(bundle);
    View frameParent = ((View) getDialog().findViewById(R.id.bottomSheet).getParent());
    frameParent.setBackgroundColor(Color.TRANSPARENT);

你也可以为框架本身做一个findViewById()

getDialog().findViewById(R.id.design_bottom_sheet).setBackgroundColor(Color.TRANSPARENT)

任何一种方式都取决于对BottomSheetDialogFragment的内部结构的了解,所以选择你喜欢的那个。

【讨论】:

我在BottomSheetFragment 中尝试了你的 sn-p,它只是改变了活动的背景颜色 @user158 错过了有关片段的部分。它是 BottomSheetDialogFragment 还是 BottomSheetDialog 感谢您愿意提供帮助。这是BottomSheetDialogFragment 很抱歉在问题中遗漏了一些信息,我更新了问题。你的回答奏效了。

以上是关于布局背景未根据 BottomSheet 布局中的可绘制背景进行裁剪的主要内容,如果未能解决你的问题,请参考以下文章

具有不同角半径的可绘制形状背景的布局上的标高

响应式Web设计 - 布局

BottomSheet的用法

BottomSheet的用法

在 Android 中,BottomSheetDialog 未正确舍入顶角

程序的内存布局