绘制一个商品属性选择的控件,需要如何绘制?
这个时候需要了解自定义view中的布局流程;
自定义veiw包括布局,绘制,触摸反馈
布局就是确定每个view的位置和尺寸,然后才能知道在哪里绘制,绘制完成后用户才能知道点哪里;
布局整体流程:
假设一个ViewGroup里面有n个子view 的布局过程
分测量和布局两个流程
①测量流程:从最上面的父view往下一级一级调用每个子view的measure()方法
调用之后父view会得到每个子view的尺寸,怎么得到?
子view自己算,父view会存下来,尺寸子view自己算,位置父view算,
算完之后把位置和尺寸(左上右下四个坐标)在第二个流程(布局流程)中使用layout()方法作为参数传给子view
②布局流程:从最上面的父view往下一级一级调用每个子view的layout()方法(在这个过程确定子view的尺寸)
必须分为两个流程,有时候测量一次无法确认子view的尺寸和位置
个体流程(某个view)
①开发者在xml文件中设置宽高尺寸
②父view在onMeasure()方法中得到开发者设置的尺寸,再结合自己的可用空间得出对子view的尺寸要求
这个时候会调用子view的measure()方法,(注:measure是调度方法,measure会调用自己onMeasure()方法)把这个尺寸要求传递给子view
③子view在onMeasure()方法中得到父view对自己的尺寸要求结合自己的特性来计算出自己的期望尺寸,并且按照父view的要求做修正
如果这个子view下面还有子view,在进行自己尺寸计算前还会调用自己子view的measure()方法对自己的子view进行尺寸测量
④父view拿到子view的期望尺寸后会进一步算出子view的实际尺寸和位置,然后调用子view的layout方法
(注:和measure同理,layout是调度方法,layout会调用自己的onLayout()方法,传递左上右下四个值)
⑤字view在自己的layout()方法中,将父view传进来的自己的实际尺寸和位置保存
和第三步同理,如果下面还有字view,还会在onLayout()里调用每个子view的layout()把他们的尺寸传给它们
draw() 是绘制的总调度,会调用onDraw()
measure() 是测量的总调度,会调用onMeasure()
layout() 和上面两个有区别,把父view传递过来的尺寸存下来,不止调度会做很多事情,layout()方法很少有重写的,因为修改里面super.layout的尺寸父view并不知道你修改,会造成冲突
onLayout() 的作用是对子view进行布局,一般情况下自定义ViewGroup会从写onLayout()方法,对自己的子view进行布局
绘制一个宽高一样的view,里面绘制一个圆