91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android 獲得View寬高的幾種方式總結

發布時間:2020-10-06 19:53:13 來源:腳本之家 閱讀:147 作者:_小馬快跑_ 欄目:移動開發

《Android開發藝術探索》筆記:

在Activity的onCreate()或者onResume()中去獲得View的高度的時候不能正確獲得寬度和高度信息,這是因為 View的measure過程和Activity的生命周期不是同步執行的,因此無法保證Activity執行了onCreate onStart onResume時,某個View已經測量完畢了,如果還沒有測量完,那么獲得的寬高就是0。可以通過下面幾種方式來獲得:

1、onWindowFocusChanged

onWindowFocusChanged:View已經初始化完畢,寬高已經有了,需要注意onWindowFocusChanged會被調用多次,Activity得到焦點和失去焦點都會執行這個回調,見下圖:

Android 獲得View寬高的幾種方式總結

1、Activity首次進入的時候執行的方法

2、跳轉到另一個Activity時

3、返回到當前Activity時
可見當執行onResume和onPause時,onWindowFocusChanged都會被調用。

 @Override
 public void onWindowFocusChanged(boolean hasFocus) {
   super.onWindowFocusChanged(hasFocus);
   if (hasFocus) {
     //獲得寬度
     int width = view.getMeasuredWidth();
     //獲得高度
     int height = view.getMeasuredHeight();
   }
 }

2、view.post(runnable)

通過post可以將一個runnable投遞到消息隊列的尾部,等待Looper調用此runnable的時候,View也已經初始化好了,示例:

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

3、ViewTreeObserver

使用ViewTreeObserver的眾多回調可以完成這個功能,比如使用OnGlobalLayoutListener這個接口,當View樹的狀態發生改變或者View樹內部的View的可見性發生改變時,OnGlobalLayout方法將會被回調,這是獲取View寬高很好的一個時機,需要注意的是,伴隨著View樹的狀態改變,OnGlobalLayout會被調用多次,示例:

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

4、view.measure(int widthMeasureSpec, int heightMeasureSpec)

通過手動對View進行measure來得到View的寬高,這里要分情況處理,根據View的LayoutParams來分:

match-parent

無法測出具體的寬高,因為根據View的measure過程,構造此種MeasureSpec需要知道parentSize,即父容器的剩余空間,而這個值我們是不知道的,所以不能測出View的大小。

具體的數值(dp/px)

比如寬高都是100px,如下measure:

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

wrap_content

如下measure:

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

View的specSize使用30位二進制表示,也就是說最大是30個1,也就是(1 << 30) - 1,在最大化模式下,我們用View理論上能支持的最大值去構造MeasureSpec是合理的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陵水| 福州市| 尉氏县| 宁波市| 鲁甸县| 布尔津县| 双峰县| 柳州市| 西安市| 渭源县| 芷江| 淮滨县| 调兵山市| 明星| 达拉特旗| 塔城市| 五指山市| 长寿区| 肇源县| 桂平市| 满洲里市| 上林县| 贵南县| 邵东县| 开鲁县| 临澧县| 西充县| 腾冲县| 通渭县| 南投县| 阿克苏市| 剑川县| 石泉县| 西吉县| 同心县| 皮山县| 沙坪坝区| 东源县| 南京市| 吴江市| 韩城市|