自定義view onMeasure方法的作用

2021-08-14 13:05:00 字數 2772 閱讀 4091

onmeasure:就是來測量設定自定義控制項大小的方法。

為什麼要重寫這個方法?

@override

protected void

onmeasure(int widthmeasurespec, int heightmeasurespec)

如果只是這樣呼叫,在裡面什麼都沒做,只是super,那麼你在xml裡設定自定義控制項的layout_width和layout_height屬性時,使用match_parent或者wrap_content,最終控制項的大小是由父控制項決定的,一般就是會填充父容器了。

如果你自己設定了具體的值,那麼大小就是你設定的值。

原來是wrap_content和match_parent這兩個屬性是不指定具體大小的,但是我們把view繪製在螢幕上是需要具體的寬度和高度的,所以如果你沒有重寫onmeasure方法,自己定義測量大小的演算法,那麼系統就根據該自定義view的父容器,去設定自定義view的大小。此時不論是wrap_content和或是match_parent,得到的效果都是一樣的,而你自己在xml裡設定了具體的大小,就會按照你指定的大小繪製顯示。

這時你就要你重寫onmeasure方法了,自定義自己的測量方法和規則,那麼當你沒有指定具體的大小,使用wrap_content時,系統會根據你在onmeasure方法裡定義的測量方法來測量自定義view,也就能達到你的需求了。

重寫時,先得到系統根據你在xml設定的屬性,自動測量到的控制項大小

final int sizewdith = measurespec.getsize(widthmeasurespec);

final int modewdith = measurespec.getmode(widthmeasurespec);

final int sizeheight = measurespec.getsize(heightmeasurespec);

final int modeheight = measurespec.getmode(heightmeasurespec);

然後定義width和height變數,用來存放自己真正需要的大小
//根據自己的需求來控制項的真實設定大小

int width = 0

;int height = 0

;

再然後,就是一堆自己的演算法,比如真實的寬度width = sizewdith + paddingleft +paddingright

最後,設定完自己需要的測量方法後,要把自己得到的真實的控制項大小設定給控制項

setmeasureddimension(width,height);
這樣重寫onmeasure方法就完成了

來個簡單點的例子:

我們想繪製乙個正方形的view,在onmeasure方法裡,我們得到系統測量的大小,然後呼叫了setmeasuredimension方法,寬高取兩者中的最小值,這樣就確保了寬高一致。

/**

* 完成對控制項的大小的測量

*@param

widthmeasurespec

*@param

heightmeasurespec

*/@override

protected void

onmeasure(int widthmeasurespec, int heightmeasurespec)

此時在xml中

android

:id=

"@+id/shape_view"

android

:layout_width=

"match_parent"

android

:layout_height=

"25dp"

/>

layout_width和layout_height 如果設定為match_parent或者wrap_content,那麼會填充父容器,這點上面已經解釋過了,如果layout_width設定為

match_parent或者wrap_content,但是layout_height設定了乙個具體的值25dp,此時

setmeasureddimension(math.min(width,height),math.min(width,height));
就起作用了,它會限定寬高一致,也就會把

layout_width裡的match_parent或者wrap_content賦予了和layout_height一樣的值,繪製出乙個寬高都是25dp的正方形。

如果你沒有重寫onmeasure方法,只是這樣呼叫

@override

protected void

onmeasure(int widthmeasurespec, int heightmeasurespec)

android

:id=

"@+id/shape_view"

android

:layout_width=

"match_parent"

android

:layout_height=

"25dp"

/>

你得到的就是乙個寬度填充父容器,高度為25dp的長方形了。

所以當你沒有具體的去指定自定義view的大小時,想通過內容來動態的撐起控制項的大小,此時你就要重寫onmeasure方法,自己定義測量的規則,你在xml裡設定

wrap_content,也不會填充父容器了,而是根據你指定的測量方法來設定控制項的大小。

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如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...