사용자 지정보기에 대한 크기 조정 및 레이아웃 문제가 계속 발생하며 누구나 "모범 사례"접근 방식을 제안 할 수 있는지 궁금합니다. 문제는 다음과 같습니다. 내용에 필요한 높이가보기의 너비에 따라 달라지는 사용자 정의보기를 상상해보십시오 (여러 줄로 된 TextView와 비슷 함). (높이가 레이아웃 매개 변수로 고정되어 있지 않은 경우에만이 기능이 적용됩니다.) 캐치 (catch)는 지정된 너비에 대해 이러한 사용자 정의보기에서 내용 높이를 계산하는 것이 비용이 많이 듭니다. 특히, UI 스레드에서 계산하기에는 너무 비쌉니다. 따라서 어느 시점에 작업자 스레드를 실행하여 레이아웃을 계산해야하며 완료 될 때 UI를 업데이트해야합니다.값 비싼보기 높이 계산을 다루는 모범 사례?
질문은 어떻게 설계해야합니까? 몇 가지 전략을 생각해 봤습니다. 그들은 모두 높이가 계산 될 때마다 해당 너비가 기록된다고 가정합니다.
첫번째 전략은이 코드에 나타내
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = measureWidth(widthMeasureSpec);
setMeasuredDimension(width, measureHeight(heightMeasureSpec, width));
}
private int measureWidth(int widthMeasureSpec) {
// irrelevant to this problem
}
private int measureHeight(int heightMeasureSpec, int width) {
int result;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else {
if (width != mLastWidth) {
interruptAnyExistingLayoutThread();
mLastWidth = width;
mLayoutHeight = DEFAULT_HEIGHT;
startNewLayoutThread();
}
result = mLayoutHeight;
if (specMode == MeasureSpec.AT_MOST && result > specSize) {
result = specSize;
}
}
return result;
}
레이아웃 나사 마감, 그것은 계산 높이 mLayoutHeight
설정하고 requestLayout()
(및 invalidate()
)를 호출하기 위해 UI 스레드에의 Runnable 게시물 때.
두 번째 전략은 mLayoutHeight
에 항상 현재 값을 사용하는 것입니다 (레이아웃 스레드를 실행하지 않고). 폭의 변경을 테스트하고 레이아웃 스레드를 실행하는 것은 onSizeChanged
을 무시하여 수행됩니다.
세 번째 전략은 게으르며 onDraw
에서 (필요한 경우) 레이아웃 스레드를 시작하는 것입니다.
가능한 한 빨리 필요한 높이를 계산하면서 레이아웃 스레드가 실행 및/또는 종료되는 횟수를 최소화하고 싶습니다. 전화 번호를 requestLayout()
으로 최소화하는 것이 좋습니다.
문서에서 알 수 있듯이 onMeasure
은 단일 레이아웃 과정에서 여러 번 호출 될 수 있습니다. onSizeChanged
이 여러 번 호출 될 수 있다는 점은 분명하지 않지만 가능성이 높습니다. 따라서 논리를 onDraw
에 넣는 것이 더 나은 전략 일 수 있다고 생각합니다. 그러나 이는 사용자 정의보기 크기 조정의 정신에 반하는 것으로 보이므로 이에 대해 필자는 비합리적으로 편향되어 있습니다.
다른 사람들도 이와 동일한 문제에 직면했을 것입니다. 제가 놓친 접근법이 있습니까? 가장 좋은 방법이 있습니까?
높이가 필요한보기에서 OnGlobalLayoutListener()를 사용할 수 없습니까? – lokoko
@ lokoko - 나는 그 제안을 이해하고 있는지 잘 모르겠다. 당신은 정교 할 수 있습니까? 문제는 다음과 같습니다. 비싼 레이아웃 높이 계산을 언제 시작해야합니까? –