2012-04-03 2 views
4

스크롤보기의 콘텐츠 크기를 늘리면 스크롤보기에 자녀의 크기 변경을 "알기"까지 시간이 걸립니다. ScrollView를 즉시 체크하도록 명령하려면 어떻게해야합니까?Android : Scrollview에 아이의 크기가 변경되었음을 알립니다. 어떻게?

저는 ScrollView의 LinearLayout에 ImageView가 있습니다.

내 ScaleListener.onScale에서 LinearLayout의 크기를 변경합니다. 그런 다음 스크롤보기에서 스크롤을 주문하려고합니다. ScaleListener.onScale에서 :

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) imageView.getLayoutParams(); 
params.width = (int) (startX * scaleFactor); 
params.height = (int) (startY * scaleFactor); 
imageView.setLayoutParams(params); 

(...) 

scrollView.scrollBy(scrollX, scrollY); 

는 그러나, 스크롤 뷰 스크롤 너무 작아서 때문에 상황에 스케일링 스크롤하기 전에 불가능했던 경우에 발생합니다. setLayoutParams 이후에는보기가 더 커야하지만 scrollview는 자식이 여전히 작다고 생각하기 때문에 스크롤이 발생하지 않습니다.

fesms 나중에 onScroll을 다시 호출하면 잘 스크롤되어 어떤 식 으로든 자식이 더 크고 스크롤 가능하다는 것을 알게되었습니다.

어린이의 크기가 변경되었다는 것을 즉시 scrollview에 알릴 수 있습니까? scrollBy는 자식의 setLayoutParams 직후에 작동합니까?

답변

6

onXXX() 방법을 시도한 후에 해결책을 찾았습니다. onLayout을 사용할 수 있습니다. 스크롤을 계획하고 나중에 onLayout()에서 할 수 있습니다.

은있는 ScrollView를 확장하고, 추가 : 이제

private int onLayoutScrollByX = 0; 
private int onLayoutScrollByY = 0; 

public void planScrollBy(int x, int y) { 
    onLayoutScrollByX += x; 
    onLayoutScrollByY += y; 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 
    doPlannedScroll(); 
} 

public void doPlannedScroll() { 
    if (onLayoutScrollByX != 0 || onLayoutScrollByY != 0) { 
     scrollBy(onLayoutScrollByX, onLayoutScrollByY); 
     onLayoutScrollByX = 0; 
     onLayoutScrollByY = 0; 
    } 
} 

을 대신 scrollBy(x,y) 사용 planScrollBy(x,y)의 코드에서 이것을 사용 할 수 있습니다. 새 크기의 자식이 "알려진"상태이지만 화면에 아직 표시되지 않은 상태에서 스크롤을 수행합니다.

수평 또는 수직 스크롤 뷰를 사용하는 경우 물론 한 방향으로 만 스크롤 할 수 있으므로이 코드를 약간 변경해야합니다 (그렇지 않을 경우 다른 축의 스크롤을 무시합니다). TwoDScrollView을 사용했는데 웹에서 찾을 수 있습니다.

0

당신이 호출 할 수

scrollView.updateViewLayout(childView, childLayout) 
관련 문제