自定义ViewGroup问题解决 世界最新
·为什么测量父要先测量子?
父需要确定给不给得起。
·为什么测量子需要父的测量规格?measureChild(child, widthMeasureSpec, heightMeasureSpec);
【资料图】
父布局分三种:知道多大,很大但不知道多大,还没分配。相应的子控件也分三种:知道要多少(子控件一样大),有多少全给,控件多大就要多少(子控件不一样大)。
·layoutParams是什么?
layoutParams代表xml里设置的宽高,但它不是int,API里有相应方法转化为int。
·getMeasuredWidth和getWidth的区别?
前者在measure()结束后就有,后者是布局结束后才有
·宽和高的测量模式和wrap、match、具体值是什么关系?
width:
Match-exactly-1080
Wrap-at_most-1080
100dp-exactly-300px
height:
Match-unspecified-0
Wrap-unspecified-0
100dp-exactly-300px
·对子控件设置ViewGroup.MarginLayoutParams layoutParams = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
和xml里对子控件的设置的是什么关系?认哪个?
认java代码。条目样式xml里的最外层设置的大小和间距是没用的,它相当于画布,条目真正的大小、背景最好从第二层开始,大小会被java覆盖,但是间距是直接不认,java不设置那就会默认0
·总结:大小和间距都只认优先java设的,写java的时候可以照着xml写
·上面可以看到自定义view继承的是ViewGroup,必须至少双参构造,即必须用代码设置并传入子控件的layoutParam。继承LinearLayout可以单参构造,认xml设置的子控件大小,但是不认xml里的间距,所以意义不大。
·注意事项:在自定义布局的代码中,getLayoutParam和child.getLayoutParam分别获取的是父与子的布局参数。
关键词: