一般要取得 android 營幕的解析度大小,可以藉由 Activity.getWindowManager().getDefaultDisplay() 先取得 Display 物件,再利用 Display 來取得 height 及 width。但是這個尺吋不是 layout 真正的尺寸,android API 也說了,因為還有一些裝飾(如 status bar),所以 layout 的尺寸會小一點。

那要如何取得 layout 真正的尺寸大小呢?由於 layout 也是繼承於 View,所以可以藉由 getHeigth 及 getWidth 來取得,但是一開始初始化時,所取得的值卻為 0。原因就出在 layout 一開始並沒有計算尺寸大小,而是在後面重新安排元件位置時才會計算。但是在那一個過程才能取得 layout 實際大小呢?

  • onAttachedToWindow()
    Called when the view is attached to a window
    getHeigth = 0
  • onWindowVisibilityChanged(int)
    Called when the visibility of the window containing the view has changed
    getHeigth = 0
  • onMeasure(int, int)
    Called to determine the size requirements for this view and all of its children
    getHeigth = 0
  • onSizeChanged(int, int, int, int)
    Called when the size of this view has changed
    getHeigth = 430
  • onLayout(boolean, int, int, int, int)
    Called when this view should assign a size and position to all of its children
    getHeigth = 430
  • onFinishInflate()
    Called after a view and all of its children has been inflated from XML
  • onDraw(android.graphics.Canvas)
    Called when the view should render its content

由上面可以知道在 onSizeChanged 會被通知尺寸改變 (0→430),在 onLayout 的 changed 也會被設置為 true 表示 layout 有變更。但是當動態設定圖片內容(ImageView.setImageBitmap)時,onMeasure 及 onLayout 也同時被呼叫,但 onLayout 的 changed 是 false,因為原始尺寸沒變只是內容物改變。

所以在 onSizeChanged 時來取得尺寸大小並做子元件的配置比較適合。

原始尺寸 320x480,實際 AbsoluteLayout 只有 320x430,其它 50 pixel 被狀態列給佔用了。

創作者介紹

邱小新の工作筆記

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()