我有一個擴展RelativeLayout
,當它使用RelativeLayout.LayoutParams
進行編程定位和大小時,需要將其自身限制爲給定的寬高比。通常情況下,我會願意爲它本身限制爲1:1,因此,如果RelativeLayout.LayoutParams
包含200 width
和100 height
,自定義RelativeLayout
將自身限制到100×100覆蓋RelativeLayout的onMeasure()以限制其長寬比
我已經使用在普通定製View
中重寫onMeasure()
以實現類似的目標。例如,我創建了自己的SVG圖像轉換器,並且呈現SVG圖像的自定義View
覆蓋了onMeasure()
,可確保對setMeasuredDimension()
的調用包含(a)符合原始測量規範的尺寸,以及(b)匹配原始SVG圖像的寬高比。
回到我的自定義RelativeLayout
,我想以類似的方式限制自己,我試圖覆蓋onMeasure()
,但我沒有取得太大的成功。知道RelativeLayout
的onMeasure()
執行所有兒童View
安置,我目前通常要做的事情,但沒有期望的結果,是覆蓋onMeasure()
,使我最初修改尺寸規格(即應用我所需的約束條件),然後致電super.onMeasure()
。就像這樣:
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec){
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
// Restrict the aspect ratio to 1:1, fitting within original specified dimensions
int chosenDimension = Math.min(chosenWidth, chosenHeight);
widthMeasureSpec = MeasureSpec.makeMeasureSpec(chosenDimension, MeasureSpec.AT_MOST);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(chosenDimension, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
什麼實際上當我做到這一點的是,奇怪的是,高度正確限制,因爲我打算,但寬度不發生。爲了說明:
指定的200在
RelativeLayout.LayoutParams
結果的高度和寬度100在我的自定義RelativeLayout
具有100的高度和寬度100 - >正確。在
RelativeLayout.LayoutParams
中指定100的高度和200的寬度會導致我的自定義RelativeLayout
高度爲100,寬度爲200. - >不正確。
我意識到,我可以代替多數民衆贊成放置RelativeLayout
在首位(在此期間,我可能做的來解決這個問題)調用的類內申請我的長寬比約束邏輯,但實際上這是我希望RelativeLayout
本身執行的實現細節。
澄清:將所得的寬度和高度值我讀回從使用getWidth()
和getHeight()
。在佈局過程再次執行後,這些值將在未來某個時間回讀。
謝謝!這對我非常有幫助。 – 2012-03-14 03:20:18