Android自定義ViewGroup View的大小和座標控制
- 除非你總是需要一個100×100畫素的控制元件,否則,你必須要重寫onMeasure。
- onMeasure方法在控制元件的父元素正要放置它的子控制元件時呼叫。它會問一個問題,“你想要用多大地方啊?”,然後傳入兩個引數——widthMeasureSpec和heightMeasureSpec。
- 它們指明控制元件可獲得的空間以及關於這個空間描述的後設資料。
- 比返回一個結果要好的方法是你傳遞View的高度和寬度到setMeasuredDimension方法裡。
- 接下來的程式碼片段給出瞭如何重寫onMeasure。注意,呼叫的本地空方法是來計算高度和寬度的。它們會譯解widthHeightSpec和heightMeasureSpec值,並計算出合適的高度和寬度值。
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int measuredHeight = measureHeight(heightMeasureSpec);
- int measuredWidth = measureWidth(widthMeasureSpec);
- setMeasuredDimension(measuredHeight, measuredWidth);
- }
- private int measureHeight(int measureSpec) {
- // Return measured widget height.
- }
- private int measureWidth(int measureSpec) {
- // Return measured widget width.
- }
- 邊界引數——widthMeasureSpec和heightMeasureSpec ,效率的原因以整數的方式傳入。在它們使用之前,首先要做的是使用MeasureSpec類的靜態方法getMode和getSize來譯解,如下面的片段所示:
- int specMode = MeasureSpec.getMode(measureSpec);
- int specSize = MeasureSpec.getSize(measureSpec);
- 依據specMode的值,如果是AT_MOST,specSize 代表的是最大可獲得的空間;如果是EXACTLY,specSize 代表的是精確的尺寸;如果是UNSPECIFIED,對於控制元件尺寸來說,沒有任何參考意義。
- 當以EXACT方式標記測量尺寸,父元素會堅持在一個指定的精確尺寸區域放置View。在父元素問子元素要多大空間時,AT_MOST指示者會說給我最大的範圍。在很多情況下,你得到的值都是相同的。
- 在兩種情況下,你必須絕對的處理這些限制。在一些情況下,它可能會返回超出這些限制的尺寸,在這種情況下,你可以讓父元素選擇如何對待超出的View,使用裁剪還是滾動等技術。
- 接下來的框架程式碼給出了處理View測量的典型實現:
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int measuredHeight = measureHeight(heightMeasureSpec);
- int measuredWidth = measureWidth(widthMeasureSpec);
- setMeasuredDimension(measuredHeight, measuredWidth);
- }
- private int measureHeight(int measureSpec) {
- int specMode = MeasureSpec.getMode(measureSpec);
- int specSize = MeasureSpec.getSize(measureSpec);
- // Default size if no limits are specified.
- int result = 500;
- if (specMode == MeasureSpec.AT_MOST)
- {
- // Calculate the ideal size of your
- // control within this maximum size.
- // If your control fills the available
- // space return the outer bound.
- result = specSize;
- }
- else if (specMode == MeasureSpec.EXACTLY)
- {
- // If your control can fit within these bounds return that value.
- result = specSize;
- }
- return result;
- }
- private int measureWidth(int measureSpec) {
- int specMode = MeasureSpec.getMode(measureSpec);
- int specSize = MeasureSpec.getSize(measureSpec);
- // Default size if no limits are specified.
- int result = 500;
- if (specMode == MeasureSpec.AT_MOST)
- {
- // Calculate the ideal size of your control
- // within this maximum size.
- // If your control fills the available space
- // return the outer bound.
- result = specSize;
- }
- else if (specMode == MeasureSpec.EXACTLY)
- {
- // If your control can fit within these bounds return that value.
- result = specSize;
- }
- return result;
- }
getWidth得到是某個view的實際尺寸.
getMeasuredWidth是得到某view想要在parent view裡面佔的大小.
- getWidth在OnCreat的時候得到的是0. 當一個view物件建立時,android並不知道其大小,所以getWidth()和 getHeight()返回的結果是0,真正大小是在計算佈局時才會計算.
2. getMeasuredWidth必須在parent view或者它自己呼叫measure()函式之後才能得到. measure函式就是計算該函式需要佔用的空間大小.
3.onMeasure會在onLayout之前呼叫
4.如果ViewGroup中的View通過動畫移動了位置 需要呼叫requestLayout()重新定位View的位置;
相關文章
- android自定義View——座標系AndroidView
- android自定義View&自定義ViewGroup(下)AndroidView
- android自定義View&自定義ViewGroup(上)AndroidView
- Android自定義View:ViewGroup(三)AndroidView
- Android自定義View基礎:座標系AndroidView
- Android自定義View:MeasureSpec的真正意義與View大小控制AndroidView
- Android自定義控制元件之自定義ViewGroup實現標籤雲Android控制元件View
- 安卓自定義View基礎:座標系安卓View
- android view 自定義viewgroup 例項--螢幕滑動AndroidView
- Android 中自定義 View、ViewGroup 理論基礎詳解AndroidView
- Android中自定義View、ViewGroup理論基礎詳解AndroidView
- Android 控制元件框架、View的分發機制和自定義ViewAndroid控制元件框架View
- Android自定義ViewGroup(一)AndroidView
- Android ViewDragHelper 自定義 ViewGroup 神器AndroidView
- Android自定義ViewGroup之子控制元件的自動換行和新增刪除AndroidView控制元件
- Android自定義View:View(二)AndroidView
- Android 自定義viewAndroidView
- Android: 自定義ViewAndroidView
- Android ViewDragHelper完全解析 自定義ViewGroup神器AndroidView
- Android自定義View整合AndroidView
- Android自定義View--翻書控制元件(一)AndroidView控制元件
- Android自定義view-自繪ViewAndroidView
- Android自定義View之Window、ViewRootImpl和View的三大流程AndroidView
- android自定義view(自定義數字鍵盤)AndroidView
- Android技術分享| 自定義ViewGroup實現直播間大小屏無縫切換AndroidView
- 重拾Android自定義ViewAndroidView
- Android自定義view詳解AndroidView
- Android 自定義 view 詳解AndroidView
- 自定義ViewGroup,實現Android的側滑選單ViewAndroid
- Android自定義view中,onDraw和onLayout對比AndroidView
- Android自定義View之Canvas的使用AndroidViewCanvas
- Android動畫效果之自定義ViewGroup新增布局動畫Android動畫View
- Android開發教程:自定義ViewGroup方法總結AndroidView
- Android獲取螢幕和控制元件座標Android控制元件
- Android自定義View播放Gif動畫AndroidView動畫
- Android 自定義View基礎(一)AndroidView
- Android自定義View之捲尺AndroidView
- Android 自定義View之下雨動畫AndroidView動畫