安卓 clipChildren 的用法细节分析

安卓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。   这是需要注意的地方.




猜你喜欢

转载自blog.csdn.net/u013394527/article/details/80066654
今日推荐