2012-04-03 6 views
4

Wenn ich die Größe des Inhalts einer Scrollview vergrößern, braucht der Scrollview eine Weile, um diese Größenänderung seines Kindes zu "kennen". Wie kann ich ScrollView bestellen, um sofort zu prüfen, ob das Kind das Kind ist?Android: Benachrichtigen Sie Scrollview, dass sich die Größe des Kindes geändert hat: Wie?

Ich habe eine ImageView in einem LinearLayout in einer ScrollView.

In meiner ScaleListener.onScale, ändere ich die Größe meiner LinearLayout. Ich versuche dann eine Schriftrolle auf dem Scrollview zu bestellen. Im 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); 

tritt jedoch kein Scrollen, wenn sie in der Situation vor der Skalierung Scrollen nicht möglich war, weil die Sicht zu klein war, zu blättern. Nach dem setLayoutParams sollte die Ansicht größer sein, aber es findet kein Bildlauf statt, da die Scrollview das Kind als noch klein ansieht.

Wenn ein fms ms später der onScroll erneut aufgerufen wird, scrollt es gut, es hat irgendwie herausgefunden, dass das Kind größer und scrollbar ist.

Wie kann ich die scrollview sofort benachrichtigen, dass sich die Größe des Kindes geändert hat? Damit scrollBy direkt nach setLayoutParams auf seinem Kind funktioniert?

Antwort

6

Ich fand eine Lösung nach dem Versuch fast jede onXXX() Methode. onLayout kann verwendet werden. Sie können die Rolle planen und später in onLayout() tun.

Erweitern Sie Ihre Scrollview und fügen:

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; 
    } 
} 

Nun, dies in Ihrem Code zu verwenden, statt scrollBy(x,y) Verwendung planScrollBy(x,y). Es wird den Bildlauf zu einer Zeit durchführen, wenn die neue Größe des Kindes "bekannt" ist, aber noch nicht auf dem Bildschirm angezeigt wird.

Wenn Sie eine horizontale oder vertikale Bildlaufansicht verwenden, können Sie natürlich nur einen Bildlauf durchführen, daher müssen Sie diesen Code ein wenig ändern (oder nicht, aber den Bildlauf auf der anderen Achse ignorieren). Ich habe eine TwoDScrollView verwendet, Sie können es im Internet finden.

0

können Sie rufen:

scrollView.updateViewLayout(childView, childLayout)