Android: Сообщите Scrollview, что размер его ребенка изменился: как? - PullRequest
4 голосов
/ 03 апреля 2012

Когда я увеличиваю размер содержимого scrollview, scrollview требуется некоторое время, чтобы «узнать» об изменении размера его потомка. Как я могу заказать ScrollView, чтобы немедленно проверить его дочерний элемент?

У меня есть ImageView в LinearLayout в ScrollView.

В моем 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 представление должно быть больше, но прокрутка не происходит, потому что представление прокрутки считает, что дочерний элемент все еще маленький.

Когда через несколько секунд снова вызывается onScroll, он прекрасно прокручивается, он каким-то образом обнаруживает, что дочерний элемент больше и прокручивается.

Как я могу немедленно уведомить прокрутку, что размер ребенка изменился? Так что scrollBy будет работать сразу после setLayoutParams на его дочернем элементе?

Ответы [ 2 ]

6 голосов
/ 18 апреля 2012

Я нашел решение после того, как попробовал почти каждый onXXX() метод.onLayout может быть использован.Вы можете запланировать прокрутку и сделать это позже в onLayout().

Расширьте вид прокрутки и добавьте:

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 голосов
/ 31 мая 2012

Вы можете позвонить:

scrollView.updateViewLayout(childView, childLayout)
...