最近处理工作bug的过程中,有一个需求是这样的,两层view,父view包含着子view,然后子view能显示出的区域,要以父view的背景来过滤。没看懂是不是?参考下图:
playground
简单说,就是子view的背景显示区域,不能超过父view的背景区域。

clipToOutline

经过一番搜索尝试,终于查到,可以通过clipToOutline + outlineProvider来实现,说来惭愧,做了将近20年android开发,竟然到现在才知道这样的特性。
具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<FrameLayout
android:id="@+id/togetherParent"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_margin="8dp"
android:background="@drawable/bg_parent"
android:clipToOutline="true"
android:outlineProvider="background"
>
<View
android:id="@+id/togetherChild"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/bg_child"/>
</FrameLayout>

但是以上代码只可以在API Level 31及以上使用,要增大适用版本范围,可以用以下代码,在kotlin中实现:

1
2
parent.clipToOutline = true
parent.outlineProvider = ViewOutlineProvider.BACKGROUND

kotlin中代码,就可以实现,低至API Level 21及以上使用。

除了clipToOutline,我还发现了其他clipToXXX有关的API。

clipChildren

本文采用CC-BY-SA-3.0协议,转载请注明出处
Author: boybeak