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方法中獲取測量寬高。
android中對View的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低版本瀏覽器。 一、