自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android中獲取View寬高的最佳方法

移動(dòng)開(kāi)發(fā) Android
使用?ViewTreeObserver?和?OnGlobalLayoutListener」這是獲取控件最終寬高的可靠方法。可以通過(guò)給控件添加一個(gè)ViewTreeObserver并注冊(cè)一個(gè)OnGlobalLayoutListener來(lái)監(jiān)聽(tīng)控件的全局布局變化。

在Android中,獲取View的寬高通常有多種方法,Android的視圖布局和測(cè)量是異步進(jìn)行的,在某些生命周期階段,控件的寬高可能還未確定。以下是獲取控件寬高的幾種常用方法:

  • 「重寫(xiě)onMeasure方法」如果是自定義View類(lèi),可以在onMeasure方法中獲取到控件的寬高。注意onMeasure方法是在測(cè)量階段調(diào)用的,此時(shí)控件的寬高值可能已經(jīng)通過(guò)父控件的布局參數(shù)設(shè)置或measureSpec確定。
  • 「使用getMeasuredWidth()和getMeasuredHeight()」這兩個(gè)方法返回的是控件在測(cè)量階段確定的寬高值。如果控件尚未經(jīng)過(guò)測(cè)量(例如,在onCreate方法中直接調(diào)用),返回的值可能是0。
  • 「使用getWidth()和getHeight()」這兩個(gè)方法返回的是控件在布局階段確定的最終寬高值。如果在布局階段之前(例如在onCreate方法中)調(diào)用,也可能返回0。
  • 「使用ViewTreeObserver和OnGlobalLayoutListener」這是獲取控件最終寬高的可靠方法??梢酝ㄟ^(guò)給控件添加一個(gè)ViewTreeObserver并注冊(cè)一個(gè)OnGlobalLayoutListener來(lái)監(jiān)聽(tīng)控件的全局布局變化。當(dāng)控件的布局完成后,OnGlobalLayoutListener的onGlobalLayout方法會(huì)被調(diào)用,此時(shí)可以安全地獲取控件的寬高。

示例代碼:

View view = findViewById(R.id.view);
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        int width = view.getWidth();
        int height = view.getHeight(); 
    }
});
  1. 「使用post方法」post方法將一個(gè)Runnable對(duì)象排隊(duì)到主線程的執(zhí)行隊(duì)列中,在控件的繪制階段之后執(zhí)行。通常用于在控件的布局和繪制完成后執(zhí)行某些操作,可以通過(guò)post方法來(lái)延遲獲取控件的寬高。

示例代碼:

View view = findViewById(R.id.view);
view.post(new Runnable() {
    @Override
    public void run() {
        int width = view.getWidth();
        int height = view.getHeight();
    }
});
  • 「使用View.LayoutParams」在某些情況下,可以通過(guò)檢查控件的LayoutParams來(lái)預(yù)測(cè)其可能的寬高。通常只適用于那些使用固定尺寸(如WRAP_CONTENT或MATCH_PARENT)或具體尺寸(如dp或px值)的控件。此方式不能保證獲取到的是控件的最終寬高。
  • 「使用onWindowFocusChanged」方法會(huì)被調(diào)用多次,在View初始化完畢后會(huì)調(diào)用,當(dāng)Activity的窗口得到焦點(diǎn)和失去焦點(diǎn)都會(huì)被調(diào)用一次(例如在Activity onResume時(shí))。

示例代碼:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
  super.onWindowFocusChanged(hasFocus);
  if (hasFocus) {
    int width = view.getMeasuredWidth();
    int height = view.getMeasuredHeight();
  }
}

在嘗試獲取控件的寬高時(shí),應(yīng)該考慮控件的生命周期和布局流程,確保在正確的時(shí)機(jī)獲取到正確的值。

責(zé)任編輯:武曉燕 來(lái)源: 沐雨花飛蝶
相關(guān)推薦

2017-04-28 09:58:21

AndroidLinearLayou寬高

2021-09-26 08:35:17

Android控件寬高

2011-12-27 10:18:31

Web

2024-08-27 11:12:31

2011-10-19 16:21:45

2017-08-21 21:36:23

AndroidViewJava

2014-08-19 10:06:53

IAP

2017-12-28 14:51:01

AndroidView焦點(diǎn)

2012-04-11 10:21:54

WEB網(wǎng)站

2011-09-01 14:36:38

敏捷

2012-03-26 10:45:00

虛擬化VMware View數(shù)字證書(shū)

2016-12-12 09:58:47

AndroidAndroid Vie

2013-01-08 13:46:58

Android開(kāi)發(fā)ViewStub布局

2013-06-25 11:06:07

Android開(kāi)發(fā)顏色定義方法

2011-06-02 09:51:05

Android 手機(jī)

2009-06-17 14:17:04

SpringXML配置文件

2009-06-17 14:36:10

SpringXML配置文件

2009-09-08 16:22:27

c# listBox

2010-07-17 15:46:03

WiMAX

2013-11-21 09:17:06

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)