Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:通知Scrollview它';s儿童';s的大小发生了变化:如何改变?_Android_Scrollview_Scaling - Fatal编程技术网

Android:通知Scrollview它';s儿童';s的大小发生了变化:如何改变?

Android:通知Scrollview它';s儿童';s的大小发生了变化:如何改变?,android,scrollview,scaling,Android,Scrollview,Scaling,当我放大scrollview内容的大小时,scrollview需要一段时间来“了解”它的子对象的大小变化。如何命令ScrollView立即检查其子级 我在滚动视图中有一个线性布局的ImageView 在ScaleListener.onScale中,我更改线性布局的大小。然后我尝试在scrollview上订购一个滚动条。在ScaleListener.onScale中: LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) im

当我放大scrollview内容的大小时,scrollview需要一段时间来“了解”它的子对象的大小变化。如何命令ScrollView立即检查其子级

我在滚动视图中有一个线性布局的ImageView

在ScaleListener.onScale中,我更改线性布局的大小。然后我尝试在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时,它确实可以很好地滚动,它不知何故发现子对象更大,并且可以滚动


我如何立即通知scrollview孩子的大小已更改?所以scrollBy在它的子对象上设置LayoutParams之后就可以工作了?

在尝试了几乎所有的
onXXX()
方法之后,我找到了一个解决方案。只能使用布局。您可以计划滚动,稍后在
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;
    }
}
现在,要在代码中使用它,请使用
plancrollby(x,y)
而不是
scrollBy(x,y)
。当孩子的新尺寸为“已知”,但尚未显示在屏幕上时,它将进行滚动

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

你可以调用:

scrollView.updateViewLayout(childView, childLayout)