clipToPadding和clipChildren

2024-01-24 09:48

本文主要是介绍clipToPadding和clipChildren,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

clipToPadding解决listview滚动问题

<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"

这里写图片描述
原理分析

问题:设置了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就会被裁剪掉,我们就看不到了。

关键代码可以看ViewGroup的dispatchDraw

  final boolean clipToPadding = (flags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK;if (clipToPadding) {clipSaveCount = canvas.save();canvas.clipRect(mScrollX + mPaddingLeft, mScrollY + mPaddingTop,mScrollX + mRight - mLeft - mPaddingRight,mScrollY + mBottom - mTop - mPaddingBottom);}

clipChildren

还有个类似的clipChildren,这个的作用是,如果子view比parent大的时候,是否裁剪,默认为true裁剪。也是在绘制阶段作用的。

举个例子,在100*100的布局里放个200*200的button会怎么样?

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:clipChildren="false"android:orientation="vertical"><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>

这里写图片描述
默认情况下结果如左图所示,Button被裁剪,只有parent内部的可以显示,clipChildren设置为true之后,如右图所示,整个button都显示出来了,非常简单.注意android:clipChildren=”false”必须在最外层布局里写才有效果。这个属性在做动画的时候非常有用,因为默认是被裁剪的,所以一个view无法超过parent,在放大或者移动的动画中就可能被裁剪,用了此属性就不会被裁剪了。

ps,为何上图中会有部分红色,这是Button样式决定的,Button上下左右都会有点留白。

总结

1、clipToPadding 是否可以在padding区域内绘制
2、子view是否可以超出父view的区域
3、对应工程ClipDemo
来源:
点击这里

这篇关于clipToPadding和clipChildren的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/639293

相关文章

Android 设置android:clipToPadding的效果

系统默认:android:clipToPadding=true 主要用途:常常用于paddingTop,假设 内部有个属性设置了PaddingTop但是滑动的时候就忽视paddingTop的 则使用该属性 如设置android:clipToPadding=false: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro

ViewGroup中clipChildren属性的用法

来自ViewGroup中的属性clipChildren用于定义一个子元素是否被限制在其父元素中进行绘制。通常用于动画效果中绘制需要超出原有尺寸限制的元素时使用。在这种情况下,需要将该属性值设置为false以确保该元素可以超出边界。缺省值为true,也即子元素不可以超出父元素的边界。 需要重点注意的是,属性值clipChildren需要被设置到爷爷节点上。 以下为布局的示例: <Line

神奇的android:clipChildren属性

前言 前几天有在微博上推荐过一个博客,看他文章时发现了这个属性。有些属性不常用,但需要的时候非常有用,于是做了个例子,正好项目用到,与大家分享一下。   声明 欢迎转载,请注明出处! 博客园:http://www.cnblogs.com/ 农民伯伯: http://www.cnblogs.com/over140/   正文 一、效果图 看到这个图时你可以先

TV开发高频属性:深入使用 clipChildren和clipToPadding

先抛出一个问题:很多博客说只要根布局clipChildren设置为false,子View就可以正常放大显示。 看完这篇你就能知道答案了。 1、 简介 clipChildren和clipToPadding是ViewGroup的方法。 clipChildren: ViewGroup的子View的绘制是否可以超出子View实际的大小区域。默认值是true,不允许超出实际的大小区域。clipToPa

clipchildren 咸鱼app 中间 图标很大的 底部 tab栏 实现方案

咸鱼app 中间 图标很大的 底部 tab栏 实现方案 代码说明: 1、只需在根节点设置android:clipChildren为false即可,默认为true 2、可以通过android:layout_gravity控制超出的部分如何显示。 3、android:clipChildren的意思:是否限制子View在其范围内 <?xml version="

android:clipChildren 被遗忘的神奇属性

在说clipChildren属性之前首先看一个效果图 做出这种效果图你能想到的方式是什么呢?用RelativeLayout?我以前就是这么干的 其实有个更好的方法,只要用了这个神奇的属性后这个效果很容易就可以实现,下面是这个属性的注意点: 1、只需在根节点设置android:clipChildren为false即可,默认为true,注意:一定是在布局文件的根节点设置,否则不起作用。 2、可

用android:clipChildren来实现红心变大特效 - 喜糖

翻文档找到下面介绍 android:clipChildren        setClipChildren(boolean)        Defines whether a child is limited to draw inside of its bounds or not. android:clipToPadding        setClipToPadding(boolean)

INFO: 避免 WS_CLIPCHILDREN 和 ActiveX 控件绘制问题

本页 概要 更多信息 有关 MFC 容器方法 有关 ATL 容器方法 常见 MFC 和 ATL 方法 参考 <script type="text/javascript"></script> <script src="common/script/gsfx/kbtoc.js?11" type="text/javascript"></script> 概要