2011-12-20 56 views
4

我有一個擴展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(),但我沒有取得太大的成功。知道RelativeLayoutonMeasure()執行所有兒童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()。在佈局過程再次執行後,這些值將在未來某個時間回讀。

回答

17

我已經解決這個現在還設置width,目前由RelativeLayoutonMeasure()舉行的LayoutParamsheight了。

@Override 
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec){ 

    int widthSize = MeasureSpec.getSize(widthMeasureSpec);  
    int heightSize = MeasureSpec.getSize(heightMeasureSpec); 

    // Restrict the aspect ratio to 1:1, fitting within original specified dimensions 
    int chosenDimension = Math.min(widthSize, heightSize); 
    widthMeasureSpec = MeasureSpec.makeMeasureSpec(chosenDimension, MeasureSpec.AT_MOST); 
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(chosenDimension, MeasureSpec.AT_MOST); 

    getLayoutParams().height = chosenDimension; 
    getLayoutParams().width = chosenDimension; 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
    } 

這現在作爲期望:在RelativeLayout的大小(和getWidth()getHeight()後續調用)現在,在我的重寫onMeasure()應用大小限制達成一致。

+2

謝謝!這對我非常有幫助。 – 2012-03-14 03:20:18