怎樣獲取到View的真正寬高?

這真是一個(gè)頭疼的問題,有時(shí)候獲得的寬高就是0.

接下來(lái)我們來(lái)試試這幾個(gè)方法。
1.onWindowFocusChanged
onWindowFocusChanged: View已經(jīng)初始化完畢了,寬高已經(jīng)準(zhǔn)備好了。這個(gè)時(shí)候去獲取寬高是沒有問題的。需要注意的是,onWindowFocusChange會(huì)被調(diào)用多次。 當(dāng)Activity的窗口得到焦點(diǎn)和失去焦點(diǎn)時(shí)均會(huì)被調(diào)用一次,具體來(lái)說(shuō),當(dāng)Activity繼續(xù)執(zhí)行和暫停執(zhí)行時(shí)。onWindowFocusChanged均會(huì)被調(diào)用,如果頻繁地進(jìn)行onResume和onPause,那么onWindowFocusChanged,也會(huì)被頻繁的調(diào)用。

@Override
public void onWindowFocusChanged(boolean hasFocus) {
   super.onWindowFocusChanged(hasFocus);
   if(hasFocus){
   // view.getMeasuredHeight();寫獲取寬高的方法
   }
}

2.view.post(runnable)
通過post可以將一個(gè)runnable投遞到消息對(duì)列的尾部,然后等待looper調(diào)用runnable的時(shí)候View已經(jīng)初始化了。(艸,筆者寫的這個(gè)東西我竟然一知半解)

@Override
protected void onStart() {
   super.onStart();
   view.post(new Runnable() {
   @Override
   public void run() {
   // view.getMeasuredHeight();寫獲取寬高的方法
   }
 });
}

3.ViewTreeObserver
使用ViewTreeObserver的眾多回調(diào)可以完成這個(gè)功能,比如使用OnGlobaLayoutListener這個(gè)接口。
當(dāng)View樹的狀態(tài)發(fā)生改變或者View樹內(nèi)部的View的可見性發(fā)生變化時(shí)。onGlobalLayout方法將會(huì)被回調(diào),因此這是獲取View的寬高一個(gè)很好的時(shí)機(jī)。但是伴隨著View樹的狀態(tài)的改變,onGlobalLayout會(huì)被調(diào)用多次。

@Override
protected void onStart() {
   super.onStart();
   ViewTreeObserver observer = searchViewLayout.getViewTreeObserver();
   observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
     @Override
     public void onGlobalLayout() {
         searchViewLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
         int width = searchViewLayout.getMeasuredWidth();
   }
   });
}

對(duì)于這個(gè)onGlobalLayout方法我是印象深刻,我記得我在那家公司寫代碼時(shí),把一個(gè)服務(wù)器請(qǐng)求寫在了這里面。由于那家公司沒有什么測(cè)試,代碼檢查方面的流程。基本上開發(fā)寫好代碼自己測(cè)試一下就上線。一上線就遭到不少客戶投訴。
“什么鬼,勞資打開你們的應(yīng)用,一個(gè)小時(shí)吃掉我五十多兆流量?”
“what the hell?”

4.view.measure();
具體代碼長(zhǎng)這樣:

@Override
protected void onStart() {
 super.onStart();
   int widthSpce = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);
   int heightSpce = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);
   searchViewLayout.measure(widthSpce,heightSpce);
   int width = searchViewLayout.getMeasuredWidth();
}

由于比較復(fù)雜,就不多描述。自己去探索吧。

注意:以上方法都沒有經(jīng)過測(cè)試,使用的時(shí)候小心有坑。###

來(lái)自Android開發(fā)藝術(shù)探索(真是一本好書!)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容