- 自定义View常用方法
-
(一)onMeasure()用于测量子控件的宽高
MeasureSpec:关键类,负责获取测量模式、测量尺寸
模式:exactly, at_most, unspecified
Exactly是写出具体的dp值,
at_most一般对应wrap_content,最大值不能超过父控件宽高
Unspecified,一般在scrollView或者listview中,要多大就多大(scrollView嵌套listView,显示不全的问题:由于scrollView测量模式采用Unspecified,导致测量高度为一个Item的高度,解决办法:自定义ListView.重写onMeasure(),使用makeMeasureSpec(int size ,int mode)更改测量模式)
setMeasuredDimension调用之后,才能使用getMeasuredWidth()和getMeasuredHeight()来获取视图测量出的宽高,以此之前调用这两个方法得到的值都会是0。
getMeasureWidth()方法中的值是通过setMeasuredDimension()方法来进行设置的,而getWidth()方法中的值则是通过视图右边的坐标减去左边的坐标计算出来的 (二)在onLayout()用于摆放子控件在父控件中的位置
常见问题
getMeasureWidth()方法在measure()过程结束后就可以获取到了,而getWidth()方法要在layout()过程结束后才能获取到(三)onDraw() 用于绘制需要的图形
主要通过canvas,paint,matrix去绘制
-(四)onTouchEvent()用于用户对控件触摸触发的方法
dispatchTouchEvent()底层采用责任链的设计模式处理事件分发
getX():触摸点到当前View左边缘的距离.
getRawX():触摸点到屏幕左边缘的距离.
-
集成 自ViewGroup,onDraw()方法不执行
原因:ViewGroup构造函数中initViewGroup()会设置:setFlags(WILL_NOT_DRAW, DRAW_MASK);
解决:1. setWillNotDraw(false)
2. dispatchDraw() -
刷新方法
onMeasure()和onLayout()最后都要调用requestLayout()才能让改变生效,onDraw()要调用invalidate()才能让改变生效,postInvalidate()(在子线程调用)才能生效;