1. 程式人生 > >Android中獲取View寬高方法

Android中獲取View寬高方法

Android開發中經常需要獲取控制元件的寬高,比如前不久我在寫一個圖片載入庫時,因為需要對Bitmap進行裁剪就遇到了需要獲取ImageView寬高的問題。
如果稍微瞭解過一下View的繪製過程,就會知道直接在onCreate()等生命週期回撥方法中獲取寬高,獲取到的值是0,所以我們需要採用一些特殊的方法去獲取。
這裡簡單總結一下獲取寬高的幾種方法:

一、通過View.post(new Runnable())獲取

這裡的view可以是你需要獲取寬高的View。要注意的view要執行此方法必須保證它已經attached到了window上,因此在此之前是不能呼叫這個方法的。

Runnable

裡可以執行獲取寬高的方法:

view.post(new Runnable(){
     @Override
     public void run() {
        int width = view.getMeasuredWidth();          
        int height = view.getMeasuredHeight();
      }
});

這個方法的原理在於:View的寬高需要在Measure 過程後才能確定,直接在onCreate()等回撥方法裡獲取只能得到0,因為此時還沒有開始Measure操作。

而通過view.post()在主執行緒的訊息佇列尾部插入了一個訊息,也就是說執行獲取寬高的操作被延後了,並且能夠保證Measure

操作在此之前,所以就能夠在這裡獲取到正確的寬高了。

有關為什麼“能夠保證Measure操作在此之前”,我會在下一篇文章裡詳細分析。

另外,在網上還可以搜到其他類似方法如使用
ViewTreeObserver.addOnGlobalLayout()/addOnPreDrawLayout()Activity/View.onWindowFocusChanged()方法中獲取的,本質也是延後了操作,等待View初始化完畢了之後再進行獲取,在這裡就不細說了。

總結:
此方法優點是保證獲取到的寬高是準確的;
缺點是不能及時獲取到,實際上還是把操作延後了,需要在Runnable裡再執行相應回撥。

二、通過LayoutParams獲取

對於在XML檔案裡設定了具體寬高的View可以通過view.getLayoutParams().height/width獲取到寬高。

總結:優點是能及時獲取到,且操作簡單;缺點是不夠通用,沒有設定具體寬高的獲取到的值就是0了。

三、手動Measure再獲取

既然View的寬高是在Measure之後才能獲得的,自行呼叫view.measure()不就行了嗎?

那麼我們需要自行構造MeasureSpec,也就是測量引數,它是一個由父容器和View自身決定的變數。有關它的具體分析,可以閱讀《Android開發藝術探索》來了解。

對於寬高設為具體數值wrap_content的控制元件,我們都可以手動構造MeasureSpec,而match_parent的情況理論上是做不到的。

對於設定了具體數值寬高的(比如都是100px),我們可以這樣構造MeasureSpec

int widthMeasureSpec = MeasureSpec.makeMeasureSpec(100,MeasureSpec.EXACTLY);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(100,MeasureSpec.EXACTLY);
view.measure(widthMeasureSpec,heightMeasureSpec);

對於設定成wrap_content的:

int widthMeasureSpec = MeasureSpec.makeMeasureSpec((1<<30)-1,MeasureSpec.AT_MOTST);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec((1<<30)-1,MeasureSpec.AT_MOST);
view.measure(widthMeasureSpec,heightMeasureSpec);

總結:優點也是可以立即獲取到寬高;缺點是無法解決match_parent的情況。



作者:SamMao
連結:https://www.jianshu.com/p/f56c92e29dea
來源:簡書

相關推薦

Android獲取View方法

Android開發中經常需要獲取控制元件的寬高,比如前不久我在寫一個圖片載入庫時,因為需要對Bitmap進行裁剪就遇到了需要獲取ImageView寬高的問題。 如果稍微瞭解過一下View的繪製過程,就會知道直接在onCreate()等生命週期回撥方法中獲取寬高,獲取到的值是0

android onCreate獲取view為0的多種解決方法

  這個問題大家肯定遇到過不止一次,其實很簡單,解決它也很容易,但是咱們追求的畢竟不是解決它,而是找到幾種方法去解決,並且這麼解決的原理是什麼。   這裡列出4種解決方案: Activity/View#onWindowFocusChanged   這個函式

android在程式碼獲取view/為0解決方法

在專案中,我們要在程式碼中獲取view的寬高資訊,有可能就會在onCreat或者onResume方法中去獲取,原因就是view的measure過程與Activity的生命週期不是同步執行的,因此無法保證在onCreat,onResume,onStart時這個vi

Activity正確獲取View

在View的measure完成後,一般可以通過getMeasureWidth/getMeasureWidth方法可以正確的獲取View的寬高,而在特殊情況下,可能需要多次measure才能確定最終的測量寬高,onMeasure無法獲取正確的寬高,但可以在onLayout方法中獲取測量寬高。

androidView的onMeasure()方法的理解

在android開發中,很多人對自定義View是望而生畏,我也一樣,但這又是向高階進階的必經之路,主要是對View裡面的很多方法不知道怎麼理解,其中一個就是onMeasure()方法,網上有很多這樣解釋說明,可能是由於我的領悟力有限,一直沒能搞明白,今天有點空,

獲取View的幾種方式及View和ViewGroup測量的簡單實現

自己指定測量規則 //這裡自己指定寬wrap_content 高100, view = (Button) findViewById(R.id.button1); int widthMeasureSpec = MeasureSpec.makeMeasureS

JS獲取網頁方法集合

JS獲取網頁寬高等方法的集合:document.body.clientWidth - 網頁可見區域寬document.body.clientHeight - 網頁可見區域高document.body.offsetWidth - 網頁可見區域寬,包括邊線和滾動條的寬docume

Android 開發獲取View檢視的的幾種方法

一、根據WindowManager管理器獲得 1)這兩種方法在螢幕未顯示的時候,還是處於0的狀態,即要在setContentView呼叫之後才有效。 2)Activity必須如此設定才能獲得view

Android——View的設定和多種獲取方法、layout_grivaty與grivaty的區別

一、設定控制元件寬高 設定Layout_width/height引發的寬高思考 方式一: 結果不符合預期。 執行結果: 方式二: 結果符合預期。 如下圖: Android控制元件寬高的規則:   Android下的控制元件預設沒有寬高,是由

Android 獲取layout之前呼叫View.measure(0,0)的原因

private ConstraintLayout constraintLayout; constraintLayout=findViewById(R.id.screen_test); constraintLayout.measure(0,0); Log.i(TAG,"onCreate:"+const

Android獲取螢幕,狀態列,actionbar,layout,導航欄高度的方法彙總

看這個部落格你可以知道 獲取螢幕寬高,狀態列寬高,actionbar寬高,layout寬高,導航欄(虛擬按鍵欄)高度的方法   目錄順序為 程式碼測試的機型 狀態列高度 actionbar高度 螢幕高度 導航欄(虛擬按鍵欄)高度 layout寬高 總

解決在onCreate()過程獲取View的width和Height為0的4種方法

得到 observer oba target 都沒有 重寫 idt tlist reat 此博客為轉載,原文請看這位老鐵的文章: https://www.cnblogs.com/kissazi2/p/4133927.html 很經常當我們動態創建某些View時,需要通過獲取

jQuery幾個關於元素方法的區別

contain ext 參數設置 oct ont doctype asc jquer cloud 幾個關於元素寬高的方法 height():帶參數設置,不帶參數獲取,參數是number類型 width():帶參數設置,不帶參數獲取,參數是number類型 innerHei

android獲取螢幕獲取控制元件

// 獲取螢幕寬高(方法1) int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 螢幕寬(畫素,如:480px) int screenHeight = getWindowManager().getDe

最全的獲取元素及位置的方法

offsetWidth / offsetHeight offsetWidth HTMLElement.offsetWidth 是一個只讀屬性,返回一個元素的佈局寬度。一個典型的(各瀏覽器的offsetWidth可能有所不同)offsetWidth是測量包含元素的邊框(border)、水平線上的內邊距(pa

安卓專案實戰之Activity啟動過程動態獲取元件的3種方式

前言 有時候我們需要在Activity啟動的時候獲取某一元件的寬或者是高用於動態的更改UI佈局,但是這時候我們直接通過getWidth和getHeight方法獲取是有問題的,如下: 我們在Activity的onCreate方法中呼叫如下的方法來獲取元件的寬高: /** * 在onC

android從values/strings資原始檔獲取拼接字串的方法

在編寫程式碼的時候,將程式碼中的字串儲存在res/values/strings資原始檔裡是一個好習慣,也是規範的做法。但是,有時候我們可能會碰到字串拼接的問題, 比如: <string name="selected">選擇了n個檔案</string>,這裡的n是隨著實

最全面的獲取元素及位置的方法

HTMLElement.offsetWidth 是一個只讀屬性,返回一個元素的佈局寬度。一個典型的(各瀏覽器的offsetWidth可能有所不同)offsetWidth是測量包含元素的邊框(border)、水平線上的內邊距(padding)、豎直方向滾動條(

Android平板適配方法

遇到的問題 抽屜裡的headview背景圖片在手機里正常,而跑在平板裡就變得非常扁 解決方法 先說第一種方法,這種方法只會獲得螢幕解析度,而Android平板的解析度有可能比配置高的Android智慧機解析度還低,我手機解析度是,而公司分配的平板解析度是800

JS快速獲取圖片方法

section 基本 chrom 行數 script 一起 分析 效果 既然 快速獲取圖片的寬高其實是為了預先做好排版樣式布局做準備,通過快速獲取圖片寬高的方法比onload方法要節省很多時間,甚至一分鐘以上都有可能,並且這種方法適用主流瀏覽器包括IE低版本瀏覽器。 一、