clipChildren和clipToPadding

clipChildren和clipToPadding两个属性的值默认都是true

1、clipChildren表示是否允许子view超出父view,在设置阴影的时候,如果该属性为true,那么阴影会被裁剪,只有设置为false的时候,阴影才会完全显示出来


可以看到阴影被裁剪了

android:clipChildren="false"一行代码就可以搞定

效果如下:


    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools">

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:clipChildren="false"

        android:background="@mipmap/ab_guide_background">

            android:id="@+id/smart_banner"

            android:layout_width="match_parent"

            android:layout_height="380dp"

            android:paddingBottom="2dp"

            android:paddingTop="2dp"

            android:paddingStart="59dp"

            android:paddingEnd="59dp"

            android:clipToPadding="false"

            app:layout_constraintEnd_toEndOf="parent"

            app:layout_constraintStart_toStartOf="parent"

            app:layout_constraintTop_toTopOf="parent"

            app:layout_constraintBottom_toBottomOf="parent"

            app:layout_constraintVertical_bias="0.8" />

2、clipToPadding属性一般与RecyclerView、ViewPager等与滚动相关的组件一起使用,例如:

            android:id="@+id/smart_banner"

            android:layout_width="match_parent"

            android:layout_height="380dp"

            android:paddingBottom="2dp"

            android:paddingTop="2dp"

            android:paddingStart="59dp"

            android:paddingEnd="59dp"

            app:layout_constraintEnd_toEndOf="parent"

            app:layout_constraintStart_toStartOf="parent"

            app:layout_constraintTop_toTopOf="parent"

            app:layout_constraintBottom_toBottomOf="parent"

            app:layout_constraintVertical_bias="0.8" />

这里设置了ViewPager的左右padding=59dp,不设置clipToPadding=false,效果如下:

只要加一行代码:clipToPadding=false,效果如下:


原理分析

问题:设置了clipToPadding=false之后,为何一开始的时候padding里没东西,滚的时候可以滚到padding里去了呢?

clipToPadding官方解释是

the ViewGroup will clip its children and resize (but not clip) any EdgeEffect to its padding, if padding is not zero.

意思是padding非空的时候,viewgroup会根据padding值来裁剪子view。

默认情况下,clipToPadding为true,表示会裁剪子view并且resize边界效果。

实际上是clipToPadding影响的是绘制的时候是否绘制padding里的子view内容。可以这么理解,clipToPadding对measure和layout无影响,只会影响draw阶段。无论clipToPadding是true还是false,滚的时候,都会滚到padding里去,但是clipToPadding为true,就会clip,这样padding里的部分就看不到了。回头看看刚才的问题,滚动前,布局是考虑padding的,所以padding里没有child元素,然后滚动的时候会把child滚动到padding里去,而由于clipToPadding=false,不裁剪,所以我们能看到padding里的child。如果设置clipToPadding=true,那padding里的child就会被裁剪掉,我们就看不到了。

原理分析参考:https://blog.csdn.net/litefish/article/details/52471273

你可能感兴趣的:(clipChildren和clipToPadding)