国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

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

2019-12-12 02:36:12
字體:
來源:轉載
供稿:網友

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

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

1、onWindowFocusChanged

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


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會被調用多次,示例:

@Overrideprotected 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是合理的。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 攀枝花市| 黄骅市| 丹凤县| 探索| 静海县| 略阳县| 保靖县| 微博| 仁寿县| 娱乐| 鸡东县| 筠连县| 莒南县| 黑龙江省| 南宁市| 洛南县| 宣威市| 竹北市| 个旧市| 民丰县| 城口县| 辰溪县| 江都市| 东乡族自治县| 锦州市| 高台县| 象山县| 连南| 宁武县| 永年县| 明水县| 贵港市| 上饶市| 襄城县| 湖南省| 山阴县| 娄烦县| 宜都市| 天津市| 从化市| 邹城市|