2012-07-31 3 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' 필드에 대한 고정 값을 지정하고 다음을 조정하고있는 사실에 맞게 캔버스를 확장하는 균일 스케일링을 시도 효과적으로 '절대적인'레이아웃 원리를 연구하고 있습니다. 정말로하고 싶으십니까? OS가 화면 크기와 밀도에 따라 자동 조정되도록하지 않으려는 특별한 이유가 있습니까? – Squonk

+0

OS가 사용자 정의 레이아웃을 컨테이너의 사용자 정의 레이아웃보다 큰 높이로 조정하면 너비에 맞게 사용자 정의 레이아웃의 크기를 조절할 수 있습니다. 컨테이너가 사용자 정의 레이아웃보다 짧은 경우, 컨테이너는 맨 아래에서 자릅니다. – Rooster242

답변

0

너비가 scale = Math.min(scaleX, scaleY);이기 때문에 너비와 높이에 문제가 발생할 수 있습니다. 이는 최소 2 개에 달려 있기 때문입니다.

는`Canvas` 그에 따라 의미 화면을

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

하지만 콘텐츠가 한 방향으로 또는 다른 방향으로 펼쳐지지 않도록 사용자 레이아웃을 균일하게 조정해야합니다. 컨테이너의 크기에 대한 보증은 없습니다. – Rooster242