自定義ViewGroup以及View的一些心得。


這裏只大概記錄一下總結:


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類型)有三種:

  1. MeasureSpec.AT_MOST;  2147483648  代表子View最多是specSize大小 xml裏指定match_parent或者 xxxDp具體數值 Mode會是at_most
  2. MeasureSpec.EXACTLY;   1073741824      代表父View希望子View的大小由specSize指定。      xml裏指定 wrap_content 會是exactly
  3. 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();


後續有發現再繼續寫。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章