【问题标题】:Android: Notify Scrollview that it's child's size has changed: how?Android:通知 Scrollview 它的孩子的大小已更改:如何?
【发布时间】:2012-04-03 12:23:39
【问题描述】:

当我放大滚动视图内容的大小时,滚动视图需要一段时间才能“知道”它的孩子的大小变化。我怎样才能命令 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之后,view应该会变大,但是没有出现滚动,因为scrollview认为child还小。

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

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

【问题讨论】:

    标签: android scrollview scaling


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以致电:

      scrollView.updateViewLayout(childView, childLayout)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多