Android:通知Scrollview它的孩子的大小已经改变了:怎么样?

时间:2012-04-03 12:23:40

标签: android scrollview scaling

当我放大scrollview内容的大小时,scrollview需要一段时间来“知道”它的孩子的这个大小变化。如何订购ScrollView立即检查它的孩子?

我在ScrollView的LinearLayout中有一个ImageView。

在我的ScaleListener.onScale中,我改变了LinearLayout的大小。然后我尝试在scrollview上订购滚动条。在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认为孩子仍然很小。

当一个fes ms之后再次调用onScroll时,它确实滚动得很好,它以某种方式发现孩子更大并且可以滚动。

如何立即通知滚动视图,孩子的大小已经改变?那么scrollBy会在它的孩子的setLayoutParams之后正常工作吗?

2 个答案:

答案 0 :(得分:6)

我在尝试几乎所有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,你可以在网上找到它。

答案 1 :(得分:0)

您可以致电:

scrollView.updateViewLayout(childView, childLayout)