Android ViewGroup的理解与封装

来源:互联网 发布:汽车行业数据查询 编辑:程序博客网 时间:2024/05/17 04:04

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

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

自定义须知:

  1. view是否支持wrap_content (有的自定义控件不打算支持就完全不需要对应的onMeasure方法)
  2. 如果有必要让你的View支持Padding ViewGroup:考虑自身的Padding和子元素的margin 我觉得尽量继承 LinearLayout毕竟里面的margin 直接用就OK了 而且xml能alt出来 view :考虑自身的Padding就OK了
  3. View中如果有线程或者动画,需要及时停止,在上图红色的部分完成初始和关闭
  4. 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的区别

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

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

对ViewGroup的封装 支持padding (流式布局与九宫格都通过此完成 减少了很多代码)
https://github.com/luhaoaimama1/ZoneStudio/blob/master/customView/src/main/java/com/zone/view/base/ViewGroup_Zone.java

1 0
原创粉丝点击