Android獲取view高度
getMeasuredHeight()與getHeight的區別
實際上在當螢幕可以包裹內容的時候,他們的值相等,只有當view超出螢幕後,才能看出他們的區別:
getMeasuredHeight()是實際View的大小,與螢幕無關,
而getHeight的大小此時則是螢幕的大小。
當超出螢幕後,getMeasuredHeight()等於getHeight()加上螢幕之外沒有顯示的大小
具體方法
我們知道在oncreate中View.getWidth和View.getHeight無法獲得一個view的高度和寬度,這是因為View元件 佈局要在onResume回撥後完成。
下面說三種方式
getViewTreeObserver
使用 getViewTreeObserver().addOnGlobalLayoutListener()來獲得寬度或者高度。
OnGlobalLayoutListener 是ViewTreeObserver的內部類,當一個檢視樹的佈局發生改變時,可以被ViewTreeObserver監聽到,這是一個註冊監聽檢視樹的觀察者(observer),在檢視樹的全域性事件改變時得到通知。ViewTreeObserver不能直接例項化,而是通過getViewTreeObserver()獲得。除了OnGlobalLayoutListener ,ViewTreeObserver還有如下內部類:
interfaceViewTreeObserver.OnGlobalFocusChangeListener
當在一個檢視樹中的焦點狀態發生改變時,所要呼叫的回撥函式的介面類
interfaceViewTreeObserver.OnGlobalLayoutListener
當在一個檢視樹中全域性佈局發生改變或者檢視樹中的某個檢視的可視狀態發生改變時,所要呼叫的回撥函式的介面類
interfaceViewTreeObserver.OnPreDrawListener
當一個檢視樹將要繪製時,所要呼叫的回撥函式的介面類
interfaceViewTreeObserver.OnScrollChangedListener
當一個檢視樹中的一些元件發生滾動時,所要呼叫的回撥函式的介面類
interfaceViewTreeObserver.OnTouchModeChangeListener
當一個檢視樹的觸控模式發生改變時,所要呼叫的回撥函式的介面類
其中,我們可以利用OnGlobalLayoutListener來獲得一個檢視的真實高度。
private int mHeaderViewHeight;
private View mHeaderView;
.....
mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mHeaderViewHeight = mHeaderView.getHeight();
mHeaderView.getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
}
});
但是需要注意的是OnGlobalLayoutListener可能會被多次觸發,因此在得到了高度之後,要將OnGlobalLayoutListener登出掉。
View post事件中獲取
還可以在VIew的post方法中獲取
public class TestHeight extends Activity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity_b);
tv = (TextView) findViewById(R.id.textView);
tv.post(new Runnable() {
@Override
public void run() {
int height= tv.getHeight();
}
});
}
}
直接測量計算
int intw=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int inth=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
textView.measure(intw, inth);
int intwidth = textView.getMeasuredWidth();
int intheight = textView.getMeasuredHeight();
歡迎掃描二維碼,關注公眾賬號
相關文章
- Android獲取狀態列高度Android
- 完美獲取Android狀態列高度Android
- Android ViewTreeObserver使用總結及獲得View高度的幾種方法AndroidViewServer
- android 獲取螢幕高度和寬度的方法Android
- jQuery獲取客戶區高度jQuery
- javascript獲取網頁的高度JavaScript網頁
- 如何獲取跨域iframe高度跨域
- Android獲得statusBar高度Android
- javascript如何獲取圖片的高度JavaScript
- js獲取iframe和父級之間元素,方法、屬,獲取iframe的高度自適應iframe高度JS
- jquery獲取元素高度程式碼例項jQuery
- iOS 精準獲取webView內容高度並自適應高度iOSWebView
- Android 監聽鍵盤狀態變化,並獲取鍵盤高度Android
- Android 獲取 View 寬高的常用正確方式,避免為零AndroidView
- 獲取view所在的ViewControllerViewController
- Swift view 中 獲取ViewControllerSwiftViewController
- Android開發 - 獲取系統輸入法高度的正確姿勢Android
- Android開發-獲取系統輸入法高度的正確姿勢Android
- 解決Android通過BitmapFactory獲取圖片寬高度相反的問題Android
- 獲取各種螢幕高度寬度(工作)
- 瀏覽器滾動條高度的獲取瀏覽器
- js如何獲取元素的高度和寬度JS
- jQuery如何獲取元素的寬度和高度jQuery
- iOS 【奇巧淫技】獲取webView內容高度iOSWebView
- iOS 【終極方案】精準獲取webView內容高度,自適應高度iOSWebView
- iOS【終極方案】精準獲取webView內容高度,自適應高度iOSWebView
- 短視訊平臺原始碼,Android獲取螢幕的高度和寬度原始碼Android
- js獲取滾動條高度例項程式碼JS
- js 獲取可視介面的高度或寬度JS
- 請問:把 Service 給 View,讓 View 自己獲取 Model 是否合理?View
- Android日常學習:如何高效 & 正確地獲取View的座標位置?AndroidView
- Laravel 5 路由獲取 與 view 多次傳參Laravel路由View
- javascript獲取圖片的真實寬度和高度JavaScript
- JS,Jquery獲取各種螢幕的寬度和高度JSjQuery
- iOS獲取字串高度iOS字串
- Android 獲得View寬高的幾種方式AndroidView
- 直播平臺原始碼,快速獲取當前狀態列高度原始碼
- javascript獲取顯示器寬度和高度程式碼例項JavaScript