clipToPadding用于解决View的滚动问题
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#2262"
android:orientation="vertical" >
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:paddingTop="16dp" >
</ListView>
</LinearLayout>
结果如下图

可以发现滚动时顶部16dp的padding是永远滚不到的,这样看起来比较奇怪,怎么解决?
只要在ListView里加入一行代码,就可以解决问题
android:clipToPadding="false"

原理分析
问题:设置了clipPadding=false后,为何开始没有展示在padding区域内呢,滚动的时候才会展示呢?
默认情况下clipPadding=true,ViewGroup会根据padding来裁剪View。
在绘制时会根据clipPadding的值来判断是否绘制padding区域内子View。可以这么理解clipPadding不会影响measure、layout只会影响draw。无论clipPadding为ture或false,子View都会滚动到padding区域内,只不过在clipPadding为true时,不绘制子View的内容而已。
clipChildren常用于解决动画问题
clipChildren的作用是:如果子View比Parent大的话,是否裁剪,默认为ture,裁剪,和clipPadding一样,主要在绘制阶段作用。
举个例子,在100100的布局里放个200200的button会怎么样?
<?xml version="1.0" encoding="utf-8"?>
<!-- Button的老太爷布局 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- Button的爷爷布局 -->
<LinearLayout
android:clipChildren="false"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Button的父布局 -->
<LinearLayout
android:background="#ff0000"
android:layout_width="100dp"
android:layout_height="100dp">
<Button
android:id="@+id/btn"
android:text="ww"
android:layout_width="200dp"
android:layout_height="200dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
效果如下

从图中可以看到Button超出了父布局100dp的限制。
注意:clipChildren=false只能放在爷爷布局才会生效,具体原因没有看源码。
网友评论