onMeasure()自定义Viewgroup第一个被执行到的方法,这个方法用来测量这个viewgroup有多大和分别给每一个子控件设置大小的作用。当然了有时候viewgroup的大小是由它的子控件来确定的。
怎么设置大小呢 setMeasuredDimension(width, height); 方法来设置,下面一段代码是经典的设置自身大小的代码,首先 MeasureSpec.getMode()方法拿到模式,xml中经常定义wrap_content或者给了一个准确的值,就是mode,mode有三种,大家可以去百度这边不详细介绍了,viewgroup中还可以用getchild()方法拿到子view并且用for循环等方式给每个子view设置大小方法,至于这么设置你可以根据父控件传回来的大小来决定也可以子view自己决定然后父控件根据ziview的大小来设置他自身的大小,父控件的传回来的大小就是你在xml中定义的那个大小。
量完了大小那么就要确定位置了,
onlayout的作用是给所有的child安排大小和摆放位置
- int widthMode = MeasureSpec.getMode(widthMeasureSpec);
- int heightMode = MeasureSpec.getMode(heightMeasureSpec);
- int widthSize = MeasureSpec.getSize(widthMeasureSpec);
- int heightSize = MeasureSpec.getSize(heightMeasureSpec);
- int width;
- int height;
- ...
- if (widthMode == MeasureSpec.EXACTLY) {
- // Parent has told us how big to be. So be it.
- width = widthSize;
- } else {
- if (mLayout != null && mEllipsize == null) {
- des = desired(mLayout);
- }
- ...
- setMeasuredDimension(width, height);