2012-07-31 124 views
0

我有一個從RelativeLayout派生的自定義佈局。我希望自定義佈局根據放置的容器佈局的大小進行縮放。縮放自定義佈局

這是我到目前爲止有我的自定義佈局:

public class ScaledRelativeLayout extends RelativeLayout { 

    private static final float HEIGHT = 460; 
    private static final float WIDTH = 380; 
    private float scale = 1.0f; 
    private float pivotX = 0.0f; 
    private float pivotY = 0.0f; 
    Matrix matrix = new Matrix(); 

    public ScaledRelativeLayout(Context cxt, AttributeSet attrs) { 
     super(cxt, attrs); 
    } 

    @Override 
    public void dispatchDraw(Canvas canvas) { 
     canvas.save(); 

     View parent = (View)getParent(); 
     int parentHeight = parent.getHeight(); 
     int parentWidth = parent.getWidth(); 

     float scaleX = (float)parentWidth/WIDTH; 
     float scaleY = (float)parentHeight/HEIGHT; 
     scale = Math.min(scaleX, scaleY); 

     pivotX = (float)parentWidth/2; 
     pivotY = 0; 

     canvas.scale(scale, scale, pivotX, pivotY); 

     super.dispatchDraw(canvas); 

     canvas.restore(); 
    } 
} 

這幾乎工程。問題是自定義視圖由於某種原因在底部被裁剪。就好像裁剪區域在繪製視圖時太小。

+0

你爲你的最後'HEIGHT'和'WIDTH'領域指定固定的值,然後調整你的事實'Canvas'相應手段有效地,您正在制定「絕對」佈局原則。你確定你想這麼做嗎?爲什麼不希望操作系統根據屏幕大小和密度自動調整,是否有特殊原因? – Squonk 2012-07-31 22:46:48

+0

當我讓操作系統決定時,只要容器的高度大於自定義佈局,它就會按照寬度縮放自定義佈局。如果容器比自定義佈局短,它會從底部開始收割。 – Rooster242 2012-08-01 01:21:26

回答

0

這是因爲您的統一比例爲scale = Math.min(scaleX, scaleY);,這可能會導致寬度和高度方面的問題,因爲它取決於兩個中的最小值。

嘗試不均勻的比例縮放畫布以適應屏幕

canvas.scale(scaleX, scaleY, pivotX, pivotY); 
+0

但我需要自定義佈局的規模均勻,以便它的內容不會向一個方向或另一個方向伸展。不能保證容器的尺寸。 – Rooster242 2012-08-01 01:17:38