@TryLoveCatch
2017-03-30T17:16:28.000000Z
字数 6652
阅读 3353
android
clipChildren
clipChildren
这个属性,一直不怎么理解,所以,写了一个demo来简单试试这个属性,我们先来看官网的定义
Defines whether a child is limited to draw inside of its bounds or not. This is useful with animations that scale the size of the children to more than 100% for instance. In such a case, this property should be set to false to allow the children to draw outside of their bounds. The default value of this property is true.
clipChildren
常见的用法就是,ViewPage
实现画廊、QQ的拖拽红点清空未读提示、底部工具栏中间ICON稍微偏大等场景。下面通过几个例子,来验证它的作用。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="400dip"
android:layout_height="400dip"
android:background="#cc000000"
android:clipChildren="false">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="500dip"
android:text="哈哈哈哈"/>
</LinearLayout>
效果如下:
结论:
我们在根布局添加了android:clipChildren="false",但是却没有起作用。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#cc000000"
android:clipChildren="false">
<LinearLayout
android:layout_width="200dip"
android:layout_height="200dip"
android:background="#cceeee11"
>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="300dip"
android:text="哈哈哈哈"/>
</LinearLayout>
</LinearLayout>
效果如下:
结论:
达到了预期,也就是说,必须在View外面再包一层ViewGroup,是不是可以理解为android:clipChildren="false"
针对的是ViewGroup的?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="400dip"
android:layout_height="400dip"
android:background="#cc000000"
android:clipChildren="false">
<LinearLayout
android:layout_width="200dip"
android:layout_height="200dip"
android:background="#cceeee11"
>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="500dip"
android:text="哈哈哈哈"/>
</LinearLayout>
</LinearLayout>
效果如下:
结论:
测试一里面根布局我们设置的是match_parent
,这次我们将根布局设置了400dip的高度,然后,Button没有显示出全部。所以说,即使设置了android:clipChildren="false"
,Button可以超出父布局,但是也得受根布局宽高的约束。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#cc000000"
android:clipChildren="false">
<LinearLayout
android:layout_width="200dip"
android:layout_height="200dip"
android:background="#cceeee11"
>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="哈哈哈哈"/>
</LinearLayout>
</LinearLayout>
效果如下:
结论:
这次,增加了拖拽,调用layout()
来改变Button的位置,我们发现,在Button超出直接父布局的时候,就会消失不见了
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#cc000000"
android:clipChildren="false">
<LinearLayout
android:layout_width="200dip"
android:layout_height="200dip"
android:background="#cceeee11"
android:clipChildren="false"
>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="哈哈哈哈"/>
</LinearLayout>
</LinearLayout>
效果如下:
结论:
这次,在直接父布局,也增加了android:clipChildren="false"
,我们发现,在Button可以在整个根布局的范围内移动了
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="400dip"
android:layout_height="400dip"
android:background="#cc000000"
android:clipChildren="false">
<LinearLayout
android:layout_width="200dip"
android:layout_height="200dip"
android:background="#cceeee11"
android:clipChildren="false"
>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="哈哈哈哈"/>
</LinearLayout>
</LinearLayout>
效果如下:
结论:
再次设置了根布局的宽和高,验证了Button的移动还是受根布局的宽高约束的
为了验证结论2,特意又加了一个例子
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="500dip"
android:background="#cc000000"
android:clipChildren="false">
<LinearLayout
android:layout_width="300dip"
android:layout_height="300dip"
android:background="#cc11ffff"
>
<LinearLayout
android:layout_width="200dip"
android:layout_height="200dip"
android:background="#cceeee11"
>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="600dip"
android:text="哈哈哈哈"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
效果如下:
我们只在根布局设置了android:clipChildren="false"
,但是貌似没起作用。
我们把android:clipChildren="false"
移到300dip的LinearLayout里,修改:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="500dip"
android:background="#cc000000"
>
<LinearLayout
android:layout_width="300dip"
android:layout_height="300dip"
android:background="#cc11ffff"
android:clipChildren="false"
>
<LinearLayout
android:layout_width="200dip"
android:layout_height="200dip"
android:background="#cceeee11"
>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="600dip"
android:text="哈哈哈哈"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
效果如下:
这个时候,Button可以扩充到300dip的范围了。
我们再次修改,在根布局也加上android:clipChildren="false"
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="500dip"
android:background="#cc000000"
android:clipChildren="false"
>
<LinearLayout
android:layout_width="300dip"
android:layout_height="300dip"
android:background="#cc11ffff"
android:clipChildren="false"
>
<LinearLayout
android:layout_width="200dip"
android:layout_height="200dip"
android:background="#cceeee11"
>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="600dip"
android:text="哈哈哈哈"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
效果如下:
这个时候,Button可以扩充到整个根布局了。
1、android:clipChildren="false"
设置在根布局即可,View外面需要ViewGrou包裹,才会起作用。
2、通过1,是不是说明,根布局设置android:clipChildren="false"
,是一种声明,声明在这个布局范围内,三级子View可以超过二级子ViewGroup的范围。也解释了,为什么View需要一个直接父ViewGroup。
3、通过测试六,我们证实了结论2,也就说,android:clipChildren="false"
只会影响包含View的直接子ViewGroup。如果,直接子ViewGroup没有包含子View,不会起作用。
4、三级子View可以超过其直接父ViewGroup,但是会受祖父ViewGroup的宽和高约束。通过测试六,我们也能证明,如果想要超过祖父布局,就需要其祖父ViewGroup的父ViewGroup也设置了android:clipChildren="false"
。
5、拖拽View的时候,即使其祖父ViewGroup设置了android:clipChildren="false"
,超过父ViewGroup之后,就不能显示了,要解决这个问题,必须其父ViewGroup也设置android:clipChildren="false"
。
6、有一个问题,就是如果View拖拽出了直接父ViewGroup的范围,触摸、点击等事件就会失效。