安卓xml 文件中 的 android:clipChildren 属性大家 应该都不陌生,关于其用法,大家也或许都能知道一二,网上资料也有很多,
最常见的理解无非就是 :允许子view的显示范围超过父view。 这也是网上资料常见的解释,但在实际使用过程中,它有时并不像我们所理解的那样产生效果。 网上的例子也大多是复制粘贴来的,并没有很仔细的讲解其用法需要注意的地方. 这篇文章带领大家来仔细分析一下其用法细节。 不想看分析过程的同学 可以直接跳过,看文章底部的结论.
错误的理解示例:
如下图的例子所示, 对父级LinearLayout 设置 clipChildren = false, 父Layout 宽度为 100dp, 而内部子View的宽度为200dp, 但在预览中可以看到,它内部的 子View 并没超出父LinearLayout的 宽度范围, 这又是为什么呢!
正确的理解:
clipChildren 作用于爷ViewGroup,用于限制子View是否可以超出父ViewGroup的范围,默认为true即不可以,也可以在代码中设置:setClipChildren (boolean clipChildren),也可以从代码中判断某个ViewGroup的clipChildren值:boolean getClipChildren()。
这一段描述中 爷ViewGroup、父ViewGroup、子View 的 位置 对应关系如下图
<LinearLayout爷
android:clipChildren="false">
<LinearLayout父>
<View子(可超出父的范围) />
</LinearLayout>
</LinearLayout>
基于以上的理解,那我们如果想让某个子view 显示 其超过父View的 范围的部分, 就必须先找到 子view的 父ViewGroup的父ViewGroup(即子View的爷爷ViewGroup), 对其 爷爷ViewGroup设置 clipChildren = false,才能达到我们想要的效果
来个例子: 如下图,这时子View就能显示超出父ViewGroup范围的部分。 (至于为什么子View左侧绿色有灰色阴影,那是因为我鼠标选中了View,IDE为方便用户查看而添加的阴影)
那么有个问题:子View现在能超过父ViewGroup了,但子View能超过爷爷ViewGroup吗? 上图中爷爷ViewGroup的宽度 是 撑满屏幕的,我们无法得出结论,我们再看下图:
这个图中,我们把爷爷 ViewGroup的宽度设为 120dp,比父ViewGroup 略大,但比子View略小。 这时我们可以看到,子View超出了父ViewGroup,但没有超出爷爷ViewGroup。因此我们得出最终结论如下:
敲黑板,画重点: (为了方便理解,我特意在主语、宾语上加了中文格式的双引号)
作用1:clipChildren 作用于爷ViewGroup,用于限制“爷爷ViewGroup的孙子View”是否可以超出“孙子View的父ViewGroup”的范围,默认为true即不可以。
作用2:孙子View虽然能显示超出 其父ViewGroup , 但不会 超出 其爷爷ViewGroup。 这是需要注意的地方.