2011-12-20 3 views
4

RelativeLayout.LayoutParams을 사용하여 프로그래밍 방식으로 위치를 지정하고 크기를 조정할 때 지정된 가로 세로 비율로 제한해야하는 RelativeLayout 확장이 있습니다. RelativeLayout.LayoutParams가 포함되어있는 경우 (200)의 width 100의 height, 사용자 정의가 RelativeLayout 100 × 100가로 세로 비율을 제한하기 위해 RelativeLayout의 onMeasure()를 재정의합니다.

에 이미 익숙해 자체를 제한하는 것, 그래서 1 : 일반적으로, 나는 일에 자신을 제한하도록 할 것 유사한 목적을 달성하기 위해 통상의 커스텀 View에서 onMeasure()을 오버라이드 (override)한다. 예를 들어, SVG 이미지 변환기를 직접 작성했으며 SVG 이미지를 렌더링하는 사용자 정의 ViewsetMeasuredDimension()에 대한 호출에 (a) 원래 측정 스펙 내에서 적합하고 (b) 일치하는 차원을 포함하도록 오버라이드 된 onMeasure()을가집니다. 원래 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); 
} 

내가이 변태, 높이가 제대로 내가 의도 한대로 제한되지만 폭이 아닌되어 있다는 것입니다 수행 할 때 실제로가 발생합니다. 설명하기 :

  • 100의 높이와 폭을 갖는 (100) 내에서 정의 RelativeLayoutRelativeLayout.LayoutParams 결과에서 (200)의 높이 (100)의 폭을 지정 - 올바른>입니다.

  • RelativeLayout.LayoutParams에서 높이와 높이를 200으로 지정하면 높이가 100이고 너비가 200 인 사용자 정의 RelativeLayout이됩니다. -> 올바르지 않습니다.

은 내가 대신 처음에 RelativeLayout을 배치 (그리고 그 동안 내가 잘 해결하기 위해 그렇게 할 수 있음) 호출 클래스 내에서 내 화면 비율 제한 논리를 적용하지만, 정말이 수 실현 RelativeLayout 자체가 수행하고자하는 구현 세부 사항입니다.

설명 : 결과 값은 getWidth()getHeight()입니다. 이 값은 레이아웃 프로세스가 다시 수행 된 후에 나중에 다시 읽혀집니다.

답변

17

나는 또한 width와 현재 onMeasure()RelativeLayout에 의해 개최 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()를 오버라이드 (override)에 적용되는 크기 제한에 동의합니다.

+2

감사합니다.이것은 대단히 나를 도왔다. –

관련 문제