自定義View(onMeasure個人理解)

2021-10-08 08:04:27 字數 2114 閱讀 4837

onmeasure方法是view的方法,主要用於測量view大小。onmeasure方法有兩個引數,分別是view寬和高的measurespec。

protected void onmeasure(int widthmeasurespec, int heightmeasurespec)
measurespec是view中的內部類,是二進位制運算,由於int是32位的,用高兩位表示mode,低30表示size。

measurespec.getmode(widthmeasurespec);//通過measurespec類提供的方法來獲取mode

measurespec.getsize(widthmeasurespec);//通過measurespec類提供的方法來獲取size

由於view的大小受到它的父布局或者子view的影響,所以需要通過measurespec來計算大小。

measurespec分別有三種mode:

at_most

父容器指定了乙個可用大小即 specsize,view 的大小不能大於這個值,具體是什麼值要看不同 view 的具體實現。它對應於 layoutparams 中的 wrap_content

exactly

父容器已經檢測出 view 所需要的精確大小,這個時候 view 的最終大小就是 specsize 所指定的值,它對應於layoutparams 中的 match_parent 和具體的數值這兩種模式

unspecified

父容器不對 view 有任何的限制,要多大給多大,這種情況下一般用於系統內部,表示一種測量的狀態 。

上面提到過view的大小受到父布局或子view的影響,所以上述的父布局三種模式,加上子view的三種layoutparams(10dp、match_parent、wrap_content),便形成了9種情況。下面結合原始碼分析一下。

/**

* 原始碼

* 可以通過該方法來計算出childview的measurespec

* @param spec 父容器的measurespec

* @param padding 父容器的padding

* @param childdimension 子view設定的layoutparams寬高

* @return 子view的measurespec

*/public static int getchildmeasurespec(int spec, int padding, int childdimension) else if (childdimension == layoutparams.match_parent) else if (childdimension == layoutparams.wrap_content)

break;

case measurespec.at_most://wrap_content,父容器的大小與子view相關,不確定大小

if (childdimension >= 0) else if (childdimension == layoutparams.match_parent) else if (childdimension == layoutparams.wrap_content)

break;

case measurespec.unspecified://父容器不對view做任何限制,要多大給多大,一般用於系統內部

//這個模式一般取決於父容器,一般在可以滾動的容器中會遇到,比如recycleview,因為可以滾動,導致子view的大小可能會超過容器的大小,所以使用此模式

if (childdimension >= 0) else if (childdimension == layoutparams.match_parent) else if (childdimension == layoutparams.wrap_content)

break;

default:

break;

}//noinspection resourcetype

return measurespec.makemeasurespec(resultsize, resultmode);

}

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...

自定義控制項 自定義鐘錶

private context mcontext 畫筆 private paint mpaint 控制項的寬 private int mwidth x方向的圓心座標 private int center 鐘錶的半徑 private int mradio 圓環的寬 private int stroke...

自定義控制項及自定義屬性

自定義控制項在android開發中的重要性,是不言而喻,眾人皆知的。希望通過這二天的學習,能讓大家了解自定義控制項的原理,熟悉自定義控制項的使用步驟,並能寫出一些普通的效果。內容介紹 1 使用系統控制項,實現自定義的效果,案例有 優酷環形選單 廣告條 viewpager 下拉列表 spinner 2...