측정 시 사용자 정의 보기 설명
커스텀 구성 요소를 시도했습니다.확장했습니다.View
을 그리세요.onDraw
재지정된 방법재정의해야 하는 이유onMeasure
그렇지 않았다면 모든 게 옳았을 겁니다누가 설명해 주시겠어요?내가 나의 글을 어떻게 써야 합니까?onMeasure
ㅠㅠ? 몇튜토리얼을 각각 저는 몇 가지 튜토리얼을 보았지만, 각각의 튜토리얼은 다른 튜토리얼과 조금 다릅니다.가끔 그들은 전화를 합니다.super.onMeasure
은 마막에그, 때로은사용다니합들지때다사니를 합니다.setMeasuredDimension
요?차이가 어디에 있습니까?
결국 저는 정확히 동일한 구성요소를 여러 개 사용하고 싶습니다.는 그 요소들을 제 했습니다.XML
파일, 하지만 얼마나 커야 할지 모르겠어요.나중에 위치와 크기를 설정하고 싶습니다(크기를 설정해야 하는 이유)onMeasure
의 경우에는onDraw
사용자 지정 구성 요소 클래스에서도 작동합니다.정확히 언제까지 해야 하나요?
onMeasure()
조건에 에 알려줄 수 이며, 조건이 인지 알아볼(Android에서 ). 또한 이러한 레이아웃 제약 조건이 무엇인지 배울 수 있는 기회이기도 합니다.match_parent
wrap_content
상황제조다건은음같과다니이패됩키징약한이러▁▁the▁up▁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
'programing' 카테고리의 다른 글
powershell v2 원격 - 암호화되지 않은 트래픽을 활성화하는 방법 (0) | 2023.08.27 |
---|---|
단추 사용 안 함 (0) | 2023.08.27 |
Rest api - 단일 리소스 필드 업데이트 (0) | 2023.08.27 |
jquery를 사용하여 스크롤바가 없는 브라우저 뷰포트의 높이와 너비를 가져오시겠습니까? (0) | 2023.08.27 |
Spring MVC - 날짜 필드 바인딩 (0) | 2023.08.27 |