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
相关文章推荐
- C#实现自定义双击事件
- WinForm实现自定义右下角提示效果的方法
- MFC自定义消息的实现方法
- C#实现ProperTyGrid自定义属性的方法
- php自定义错误处理用法实例
- ThinkPHP中自定义目录结构的设置方法
- C#自定义事件监听实现方法
- C#自定义事件及用法实例
- C#自定义签名章实现方法
- C#中使用IFormattable实现自定义格式化字符串输出示例
- javascript 自定义常用方法第1/2页
- 谈谈JavaScript自定义回调函数
- 自定义jQuery插件方式实现强制对象重绘的方法
- jQuery实现自定义checkbox和radio样式
- Jquery Mobile 自定义按钮图标
- jquery自定义插件开发之window的实现过程
- jQuery实现自定义事件的方法
- jQuery创建自定义的选择器用以选择高度大于100的超链接实例
- 教你如何自定义百度分享插件以及bshare分享插件的分享按钮
- Jquery 自定义动画概述及示例