programing

측정 시 사용자 정의 보기 설명

lovejava 2023. 8. 27. 08:48

측정 시 사용자 정의 보기 설명

커스텀 구성 요소를 시도했습니다.확장했습니다.View을 그리세요.onDraw재지정된 방법재정의해야 하는 이유onMeasure그렇지 않았다면 모든 게 옳았을 겁니다누가 설명해 주시겠어요?내가 나의 글을 어떻게 써야 합니까?onMeasureㅠㅠ?튜토리얼을 각각 저는 몇 가지 튜토리얼을 보았지만, 각각의 튜토리얼은 다른 튜토리얼과 조금 다릅니다.가끔 그들은 전화를 합니다.super.onMeasure은 마막에그, 때로은사용다니합들지때다사니를 합니다.setMeasuredDimension요?차이가 어디에 있습니까?

결국 저는 정확히 동일한 구성요소를 여러 개 사용하고 싶습니다.는 그 요소들을 제 했습니다.XML파일, 하지만 얼마나 커야 할지 모르겠어요.나중에 위치와 크기를 설정하고 싶습니다(크기를 설정해야 하는 이유)onMeasure의 경우에는onDraw사용자 지정 구성 요소 클래스에서도 작동합니다.정확히 언제까지 해야 하나요?

onMeasure() 조건에 에 알려줄 수 이며, 조건이 인지 알아볼(Android에서 ). 또한 이러한 레이아웃 제약 조건이 무엇인지 배울 수 있는 기회이기도 합니다.match_parent wrap_content상황제조다건은음같과다니이패됩키징약한이러▁theup▁are다▁▁into됩패징키상같.MeasureSpec메서드에 전달되는 값입니다.모드 값의 대략적인 상관 관계는 다음과 같습니다.

  • 정확히 의미하는 것을 의미합니다.layout_width또는layout_height값이 특정 값으로 설정되었습니다.당신은 아마도 당신의 견해를 이 크기로 만들어야 할 것입니다.다음과 같은 경우에도 트리거될 수 있습니다.match_parent를 사용하여 크기를 정확하게 상위 뷰로 설정합니다(프레임워크에 종속된 레이아웃임).
  • AT_MOST는 일반적으로 다음을 의미합니다.layout_width또는layout_height값이 다음으로 설정되었습니다.match_parent또는wrap_content여기서 최대 크기가 필요하며(프레임워크에 종속된 레이아웃임), 상위 치수의 크기가 값입니다.이 크기보다 크면 안 됩니다.
  • 지정되지 않음은 일반적으로 다음을 의미합니다.layout_width또는layout_height값이 다음으로 설정되었습니다.wrap_content은 당신이.당신은 당신이 원하는 사이즈로 만들 수 있습니다.일부 레이아웃에서는 이 콜백을 사용하여 원하는 크기를 파악한 후 두 번째 측정 요청에서 실제로 전달할 사양을 결정합니다.

와 함께 .onMeasure()은 것은입니다.setMeasuredDimension() 보기를 원하는 크기로 마지막에 반드시 호출해야 합니다.이 메서드는 에서 발견된 기본 구현을 포함하여 모든 프레임워크 구현에서 호출됩니다.View그래서 전화하는 것이 안전한 이유입니다.super사용자의 사용 사례에 맞는 경우 대신.

그렇지 , 를 물론 프 워 크 적 기 필 하 없 수 을 요 도 경 작 우 콘 공 츠 보 은 다 텐 이 간 보 기 있 만 지 가 이 할 방 레 재 때 임 을 문 에 법 의 용 정 가 을 기 구 본 현 ▁view ▁with ▁out 그리고 사용자 정의 보기를 배치할 경우 클리핑이 표시될 수 있습니다.wrap_content양쪽 방향에서, 프레임워크가 얼마나 큰지 모르기 때문에 당신의 보기가 전혀 나타나지 않을 수도 있습니다!

일반적으로 오버라이드하는 경우View다른 기존 위젯이 아니라 다음과 같이 간단한 경우에도 구현을 제공하는 것이 좋습니다.

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

    int desiredWidth = 100;
    int desiredHeight = 100;

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

    int width;
    int height;

    //Measure Width
    if (widthMode == MeasureSpec.EXACTLY) {
        //Must be this size
        width = widthSize;
    } else if (widthMode == MeasureSpec.AT_MOST) {
        //Can't be bigger than...
        width = Math.min(desiredWidth, widthSize);
    } else {
        //Be whatever you want
        width = desiredWidth;
    }

    //Measure Height
    if (heightMode == MeasureSpec.EXACTLY) {
        //Must be this size
        height = heightSize;
    } else if (heightMode == MeasureSpec.AT_MOST) {
        //Can't be bigger than...
        height = Math.min(desiredHeight, heightSize);
    } else {
        //Be whatever you want
        height = desiredHeight;
    }

    //MUST CALL THIS
    setMeasuredDimension(width, height);
}

값도 포장 용기에 따라 달라지기 때문에 실제로 답변이 완료되지 않았습니다.상대 레이아웃 또는 선형 레이아웃의 경우 값은 다음과 같이 작동합니다.

  • 정확하게 일치하는 match_parent는 정확하게 + 부모 크기입니다.
  • AT_MOST wrap_content는 AT_MOST MeasureSpec을 생성합니다.
  • 지정되지 않음 트리거되지 않음

수평 스크롤 뷰의 경우 코드가 작동합니다.

측정값에서 무언가를 변경할 필요가 없는 경우에는 이를 재정의할 필요가 전혀 없습니다.

Devunwired 코드(여기서 선택되고 가장 많이 투표된 답변)는 SDK 구현이 이미 사용자에게 제공하는 것과 거의 동일합니다(그리고 확인했습니다. 2009년부터 그렇게 했습니다).

onMeasure 방법은 다음에서 확인할 수 있습니다.

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
            getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}

public static int getDefaultSize(int size, int measureSpec) {
    int result = size;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);

    switch (specMode) {
    case MeasureSpec.UNSPECIFIED:
        result = size;
        break;
    case MeasureSpec.AT_MOST:
    case MeasureSpec.EXACTLY:
        result = specSize;
        break;
    }
    return result;
}

SDK 코드를 완전히 동일한 코드로 대체하는 것은 의미가 없습니다.

"측정값()의 기본값은 항상 100x100의 크기를 설정할 것이다"라고 주장하는 이 공식 문서의 글은 잘못되었습니다.

언급URL : https://stackoverflow.com/questions/12266899/onmeasure-custom-view-explanation