您的位置:首页 > 移动开发 > Android开发

Android ViewGroup的理解与封装

2015-11-23 12:01 253 查看

通常情况下,有以下三种方法来实现自定义的控件。

对现有控件进行拓展
通过组合来实现新的控件
从写View来实现全新的控件


自定义须知:

view是否支持wrap_content (有的自定义控件不打算支持就完全不需要对应的onMeasure方法)

如果有必要让你的View支持Padding ViewGroup:考虑自身的Padding和子元素的margin 我觉得尽量继承 LinearLayout毕竟里面的margin 直接用就OK了 而且xml能alt出来 view :考虑自身的Padding就OK了

View中如果有线程或者动画,需要及时停止,在上图红色的部分完成初始和关闭

View 带有滑动嵌套情形的时候,需要处理好滑动冲突

在View中通常有一些比较重要的回调方法:

onFinishInflate():从XML加载组件后的回调

onSizeChanged ()[在onMeasure之,onLayout之前 而且不一定执行]:组件大小改变时回调

onMeasure():回调该方法进行测量

onLayout():回调该方法来确定显示的位置

onTouchEvent():监听触摸事件的回调

MeasureSpec的理解

重写之前先了解MeasureSpec的specMode,一共三种类型:

EXACTLY:一般是设置了明确的值或者是MATCH_PARENT

AT_MOST咱们特殊处理这个):表示子布局限制在一个最大值内,一般为WARP_CONTENT

UNSPECIFIED:表示子布局想要多大就多大,很少使用(一般都系统用 咱们不考虑)

此类设计的有些巧妙 为了减少内存 通过加密和解密的方式把 两个内容封装到了一个参数里

注意:因为参数是int 所以即使没有加密的int也是可以有mode 和size的

getMode 解密成 mode

getSize 解密成Size

ViewGroup的两个方法 来布局

onMeasure: 通过测量孩子的大小 来真正测量自己需要多大 如果不考虑 wrap_content 则可以不写此方法,直接在布局里写逻辑!!!

通过setMeasuredDimension(int width,int height) 会为view传递测量的宽高

onLayout:知道自己多大后 然后给孩子布局

需要兼容的属性:visibility,padding,margin

visibility: 当由非Gone变成Gone或者 Gone变非 Gone 会走viewgroup的onMeasure,onLayout

padding:仅仅考虑自身的Padding即可

EXACTLY:这种则会移动 内容在 控件中的位置

wrap_content:这种情况会撑大 控件 即内容到控件周围的空隙

margin:需要考虑所有子view的magrin(此margin必须符合 此ViewGroup的Margin)

此为padding和margin的区别



padding:是自定义控件自己去支持的

margin:则不需要考虑自己的 因为这是父控件支持的

对ViewGroup的封装 支持padding (流式布局与九宫格都通过此完成 减少了很多代码)

https://github.com/luhaoaimama1/ZoneStudio/blob/master/customView/src/main/java/com/zone/view/base/ViewGroup_Zone.java
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android+ 自定义