当我放大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之后正常工作吗?
答案 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)