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