這裏只大概記錄一下總結:
1、android:layout_width 以及android:layout_height指的是該控件在layout(這個layout我理解爲viewGroup)中的寬度和高度 而不是該控件的寬度和高度
比如一個Button在沒有放入到一個viewGroup之前,隨便指定android:layout_height的值都是沒有用的。
2、自定義ViewGroup,onMeasure(int widthMeasureSpec, int heightMeasureSpec)
可以通過 int specMode = MeasureSpec.getMode(int measureSpec); 獲取mode
int specSize = MeasureSpec.getSize(int measureSpec); 獲取數值 這裏的數值都是piexl 像素而不是dip
Mode(int類型)有三種:
- MeasureSpec.AT_MOST; 2147483648 代表子View最多是specSize大小 xml裏指定match_parent或者 xxxDp具體數值 Mode會是at_most
- MeasureSpec.EXACTLY; 1073741824 代表父View希望子View的大小由specSize指定。 xml裏指定 wrap_content 會是exactly
- MeasureSpec.UNSPECIFIED; 0 代表大小沒有限制 什麼情況會是Unspecfied我不知道。
3、onlayout(boolean change,int l,int t,int r,int b);
change 代表大小是否改變 由父View setFame(l t r b)得出。
l t r b 代表相對於父View 的 left top rigth bottom 的距離。
我覺得可以理解爲 這個View的左上角點的座標(left,top)以及右下角點的座標(rigth,bottom),確定這兩點就可以確定一個矩形(即這個View)的寬高以及這個View在父View的位置。 (這樣挺好理解的)
那麼理論上來說 :
r-l 就是view的寬度(這個寬度是view.getWidth得到的而不是getMeasuredWidth)
b-t 就是view的高度(getHeight)
但是如果 r-l 小於了view的寬度 或者 b-t小於了view的高度,那麼layout之後會導致該View顯示不完全。
所以有時候將layout寫成: laytou(left,top,left+view.getMeasuredWidth,top+view.getMeasuredHeight)會好點。
4、View只有在被measure之後 getMeasuredHeight以及getMeasuredWidth纔會有數值
(viewgroup onMeasure view被父view measure之後)
5、View只有在被layout之後 getHeight 以及getWidth纔會有數值
6.根據第3點可以得出 getMeasuredHeight 和getHeight 不一定會相等。
7.invalidate()最終調用到performTraversals()(view繪製的入口)方法,measure以及layout是不會執行到的,而onDraw會執行到;
requestLayout()方法則都會執行到;所以如果需要改變view的大小位置就不能靠invalidate而需要requestLayout();
後續有發現再繼續寫。