Android中獲取控件寬高的4種方法集合
借鑒自開發(fā)藝術(shù)
1.onWindowFocusChanged
這個(gè)方法會(huì)被調(diào)用多次,在View初始化完畢后會(huì)調(diào)用,當(dāng)Activity的窗口得到焦點(diǎn)和失去焦點(diǎn)都會(huì)被調(diào)用一次(Activity繼續(xù)執(zhí)行和暫停執(zhí)行時(shí))。
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); } }
2.view.post
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ViewGroup root = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.activity_main, null, false); setContentView(root); final View view = root; view.post(new Runnable() { @Override public void run() { int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); Log.i(TAG, width + " " + height); } }); }
具體原理暫時(shí)還不懂,不過應(yīng)該是view封裝的異步回調(diào)初始化后,view的測(cè)繪多半也完成了,這是一個(gè)同步的過程。所以才可以接收到消息。
3.ViewTreeObserver
他有許多回調(diào)。比如當(dāng)View樹的狀態(tài)發(fā)生改變或者View樹內(nèi)部的View可見性發(fā)現(xiàn)改變時(shí),onGlobalLayout方法將被回調(diào)。
final View view = root; ViewTreeObserver observer = view.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); Log.i(TAG, width + " " + height); } });
通過一種增加global listener又移除的方式,獲取觀察而來的消息。
4.view.measure
手動(dòng)測(cè)繪,分3種情況:
一、match_parent
這個(gè)情況是獲取不到的。構(gòu)造這種情況的MeasureSpec需要知道父容器的剩余空間。
二、具體的數(shù)值(dp/px)
比如寬高都是100px,可以這樣做:
View view = root; int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); view.measure(widthMeasureSpec, heightMeasureSpec); Log.i(TAG, widthMeasureSpec + " " + heightMeasureSpec);
到這里為止了,這種方法不推薦,因?yàn)闇y(cè)出來發(fā)現(xiàn)有錯(cuò)誤。
以上這篇Android中獲取控件寬高的4種方法集合就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android Flutter實(shí)現(xiàn)自定義下拉刷新組件
在Flutter開發(fā)中官方提供了多平臺(tái)的下拉刷新組件供開發(fā)者使用。本文將改造一下這些組件,實(shí)現(xiàn)自定義的下拉刷新組件,感興趣的可以了解一下2022-08-08Android打印機(jī)--小票打印格式及模板設(shè)置實(shí)例代碼
這篇文章主要介紹了Android打印機(jī)--小票打印格式及模板設(shè)置實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04Android中ImageCropper矩形、圓形 裁剪框的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Android中ImageCropper矩形、圓形 裁剪框的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2018-07-07AndroidStuio插件開發(fā)適用于jetbrains全家桶
這篇文章主要介紹了AndroidStuio插件開發(fā)適用于jetbrains全家桶,本文通過實(shí)例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12