Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android獲取view高度

Android獲取view高度

編輯:關於Android編程

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();

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved