view测量与绘制
view的测量
MeasureSpec:
定义:由SpecMode(int)于SpecSize(int)打包成一个int值(避免过多的对象内存分配)。它是一个32位(4字节)的int值,高2位是specMode(测量模式),低30位是 specSize(测量的大小)。
功能:很大程度决定一个view的尺寸规格。
SpecMode:
定义:测量模式(分三种)
1.EXACTLY:layout_width或者layout_height为具体数值或者match_parent时,使用这种模式,此时的view为SpecSize所指定的大小。
2.AT_MOST:layout_width或者layout_height为wrap_content时,父容器给出了测量大小SpecSize,但是具体大小还是要根据子控件内容来调控(只要不超过父控件测量的最大尺寸即可)。
3.UNSPECIFIED:
父容器不指定大小,一般用于系统内部的测量。
onMeasure:
重写onMeasure( )方法需要调用setMeasureDimension最终将测量后的值设置上。
ViewGroup的测量
通常需要重写onLayout方法确认位置,一般不需要绘制(onDraw),但是会调用dispatchDraw()来绘制其子view。
注:无论是测量还是布局位置,还是绘制,viewGroup都是遍历子view,获取每一个子view的数据(onMeasure和onLayout)或调用子view的方法(onDraw)。
View的绘制
onDraw:
1.canvas:
装载画布:Canvas canvas = new Canvas(bitmap);
canvas与bitmap有关联绘制操作都是作用在这个bitmap上的。
2.自定义控件:
View中重要的回调方法:
onFinishInflate():从XML加载组件后调用。
onSizeChanged():组件大小变化时回调。
onMeasure():需要测量view大小时回调。
onLayout():确定显示位置时回调。
onTouchEvent():监听触摸时间回调。
三种自定义控件的方法
1.对现有控件进行拓展
2.通过组合的方式实现新的控件
3.重写view来实现全新的控件
事件拦截机制:
ViewGroup:dispatchtouchEvent —> onInterceptTouchEvent —>onTouchEvent
view: dispatchtouchEvent —>onTouchEvent
注:这三个方法的返回值: true-不传递 false-传递
网友评论