gpt4 book ai didi

Android:通知 Scrollview 它的 child 的大小已经改变:如何?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:06 24 4
gpt4 key购买 nike

当我放大 ScrollView 内容的大小时, ScrollView 需要一段时间才能“知道”它的 subview 的大小变化。我如何命令 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);

但是,在无法缩放滚动之前的情况下,不会发生滚动,因为 View 太小而无法滚动。 setLayoutParams 之后,view 应该变大了,但是没有发生滚动,因为 scrollview 认为 child 还是很小。

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

我怎样才能立即通知 ScrollView , child 的大小已经改变了?这样 scrollBy 就可以在它的子项上设置 LayoutParams 之后立即工作吗?

最佳答案

在尝试几乎所有的 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;
}
}

现在,要在您的代码中使用它,请使用 planScrollBy(x,y) 而不是 scrollBy(x,y)。它会在 child 的新尺寸“已知”但尚未显示在屏幕上时进行滚动。

当您使用水平或垂直滚动​​ View 时,当然您只能以一种方式滚动,因此您必须稍微更改此代码(或不更改,但它会忽略另一个轴上的滚动)。我用了一个TwoDScrollView,你可以在网上找到它。

关于Android:通知 Scrollview 它的 child 的大小已经改变:如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9993179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com