自定义View/ViewGroup
2016-05-15 10:43:06 0 举报
AI智能生成
自定义View/ViewGroup
作者其他创作
大纲/内容
measure:final类型的方法,不能重写,
会直接调用onMeasure方法。用来测量View的宽、高
onMeasure:是View所用方法,直接完成测量。
MeasureSpec:32位int值,
高两位代表SpecMode(测量模式),
低30位代表SpecSize(测量大小)
getMode:获取测量模式
UNSPECIFIED:父容器不对View有任何限制,一般用于系统内部
EXACTLY:父容器已经检测出View所需的精确大小,最终大小就是SpecSize的值,
对应于LayoutParams中的MATCH_PARENT和具体的数值这两种模式
AT_MOST:父容器指定一个可用的大小即SpecSize,View的大小不能大于这个值,
具体是什么值,由View去实现。对应于LayoutParams中的WRAP_CONTENT
getSize:获取测量大小
子元素的MeasureSpec创建与父容器的MeasureSpec、子元素的LayoutParams、padding、margin有关
makeMeasureSpec(mode,size):组装成一个MeasureSpec
LayoutParams
LayoutParams.MATCH_PARENT:精确模式,大小就是父元素大小
LayoutParams.WRAP_CONTENT:最大模式,大小不定,但是不能超过父元素的大小
固定大小:精确模式,大小为LayoutParams中指定的值
可用方法
getMeasuredHeight:获取到View测量后的高
setMeasuredDimension:根据SpecMode来设置大小,在这里实现wrap_content
measureChildren:是ViewGroup所用方法,对子元素进行遍历并measure
layout:确定View自身的的位置
onLayout:对子元素进行遍历并layout(最好在此才获取View的宽高)
可用方法
getWidth/Height:获取View实际的宽、高
在onCreat、onStart、onResume无法获取到某个View的宽高,
因为View的measure过程和Activity生命周期不是同步执行,应该用这四种方法之一
WindowFocusChanged
View.post
ViewTreeObserver
View.measure
getRight/Left/Top/Bottom:获取View的四个顶点位置
setFrame:设置View四个顶点的位置
执行次序:父layout->setFrame->onLayout->setChildFrame->子layout->setFrame->onLayout
draw:将View绘制在屏幕上
drawBackground(canvas)或设置背景:绘制背景
没有背景则不能绘制
onDraw(canvas):绘制自己
dispatchDraw(canvas):对子元素进行遍历并draw
onDrawScrollBars(canvas):绘制装饰
分类
继承View重写onDraw方法
用于实现一些不规则效果,通过绘制方式来实现,即重写onDraw方法。
采用这种方式需要自己支持wrap_content,并且padding也需自己处理
继承ViewGroup派生特殊的Layout
用于实现自定义的布局,需要合适处理ViewGroup的测量、布局这两个过程,并同时处理子元素的测量和布局
继承特定的View
用于拓展已有View的功能,不需要自己支持wrap_content和padding等
继承特定的ViewGroup
和2差不多,但不用自己处理ViewGroup的测量和布局
须知
让View支持wrap_content
直接继承View或者ViewGroup的控件,如果不在onMeasure中对wrap_content做特殊处理,那么wrap_content是不起作用的,会与match_parent相同效果
如果有必要,让View支持padding
直接继承View,如果不在draw方法中处理padding,那么padding是不起作用的。
直接继承Viewgroup需要在onMeasure和onLayout中考虑padding和子元素的margin对其造成的影响,不然导致padding和子元素的margin失效
尽量不要在View中使用Handler
View内部提供post系列方法
View中如果有线程或者动画,需要及时停止
否则可能造成内存泄漏
View带有滑动嵌套情形时,需要处理好滑动冲突
0 条评论
下一页