一、自定义View步骤
1、自定义View的属性
2、在View的构造方法中获得我们的自定义属性
3、重写OnMeasure
4、重写OnDraw
二、自定义View某些问题
1、为什么自定义View 中设置的wrap_content属性不起作用(与match_parent相同作用)?
在View的onmeasure方法中
setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}
(1)、getDefaultSize//根据View宽/高的测量规格计算View的宽/高值。
当View的测量模式是AT_MOST或EXACTLY时,View的大小都会被设置成子View MeasureSpec的specSize,所以wrap_content和match_content会起到相同的作用。
(2)、子View MeasureSpec的specSize的值是多少?
,子View的MeasureSpec值是根据子View的布局参数(LayoutParams)和父容器的MeasureSpec值计算得来,具体计算逻辑封装在getChildMeasureSpec()里。
https://www.jianshu.com/p/85548a440cd2(普通View的MeasureSpec创建规则)
所以specSize的值为父控件当前剩余控件大小=match_content
2、textview
- 如果TextView的高度和宽度都是定尺寸,那么不管setText传入的什么内容,都不会重新布局,因为尺寸定死了。
- 如果TextView的宽度是定尺寸,而高度是wrap_content,那么如果在setText重新设置内容之前,高度是两行高度,那么当重新设置的内容如果高于两行或者低于两行,都应该重新布局的,这时会要求父布局重新布局。
- 如果TextView的宽度wrap_content,高度是定尺寸,那么一旦宽度发生变化,就会要求父布局重新布局。
如果父View重新布局会measureChild,子View重新onMeasure。
3、RelativeLayout onMeasure次数:
RelativeLayout会对子View做两次measure(理论上执行3次)/ (实际上次是4次),View在显示的时候会经历两次OnMeasure(ViewRootImpl类中-->performTraversals()方法调用两次)。
https://blog.csdn.net/wz249863091/article/details/51757069(RelativeLayout源码解析)
https://www.jianshu.com/p/733c7e9fb284(View为什么会至少进行2次onMeasure、onLayout)
4、LinearLayout不一定只OnMeasure一次,跟weight有关。
https://www.jianshu.com/p/0ca9ce789e39(LinearLayout的measure次数)
https://blog.csdn.net/sun20209527/article/details/51554124(LinearLayout 源码分析)!
LinearLayout OnMeasure.png
普通View的MeasureSpec创建规则.png
网友评论