添加子项时如何正确地继续滚动 ScrollView?
How can you correctly continue the fling of a ScrollView when adding children?
上下文:我有一个 ScrollView
,它可能在快速浏览期间将子项添加到其内容视图中。由于 fling 配置了 ScrollView
内容的高度 before 添加了这些子项,如果添加了子项,则 fling 会自行停止(实际上会向后滚动一点,因为overscroll) 即使它还没有到达内容的底部。
我可以使用 #fling(int velocity)
重新启动投掷,但我想不出获取当前投掷速度或停止当前投掷的方法。有什么想法吗?
我用 @Override
fling 方法解决了类似的问题。如果您在 ScrollViewNoFling
class 上重写 fling
方法而不是在此方法上调用 super.fling
,您将无法处理 scrollView
.
@Override
public void fling (int velocity)
{
/*Scroll view is no longer going to handle scroll velocity.
* super.fling(velocity);
*/
}
根据提示回答您的问题:
- 没有API获取ScrollView的当前速度。
- 您可以按照前面 SO post.
中所述小心处理触摸事件来停止当前的 fling
查看ScrollView source code,它使用OverScroller 来处理fling 事件。有两种方法可以解决这个问题:
- 使用反射访问ScrollView中的mScroller私有字段。一旦你访问它,你就可以通过它的 public API 获得当前速度:
public float getCurrVelocity();
使用反射从来都不是理想的,因为你不得不担心它会跨越 android 版本,但简单的隔离使用可能相对有效。
- 覆盖 fling() method in ScrollView 并实例化一个 OverScroller 以跟踪滚动。如果一切顺利,您的 Overscoller 将始终处于与 ScrollView 中的状态相同的状态。
像这样:
@Override
public void fling(int velocityY)
{
// Pass through fling to parent
super.fling(velocityY);
// Keep track of velocity using our own Overscoller instance
mOurOverscroller = mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0,
Math.max(0, bottom - height), 0, height/2);
}
上下文:我有一个 ScrollView
,它可能在快速浏览期间将子项添加到其内容视图中。由于 fling 配置了 ScrollView
内容的高度 before 添加了这些子项,如果添加了子项,则 fling 会自行停止(实际上会向后滚动一点,因为overscroll) 即使它还没有到达内容的底部。
我可以使用 #fling(int velocity)
重新启动投掷,但我想不出获取当前投掷速度或停止当前投掷的方法。有什么想法吗?
我用 @Override
fling 方法解决了类似的问题。如果您在 ScrollViewNoFling
class 上重写 fling
方法而不是在此方法上调用 super.fling
,您将无法处理 scrollView
.
@Override
public void fling (int velocity)
{
/*Scroll view is no longer going to handle scroll velocity.
* super.fling(velocity);
*/
}
根据提示回答您的问题:
- 没有API获取ScrollView的当前速度。
- 您可以按照前面 SO post. 中所述小心处理触摸事件来停止当前的 fling
查看ScrollView source code,它使用OverScroller 来处理fling 事件。有两种方法可以解决这个问题:
- 使用反射访问ScrollView中的mScroller私有字段。一旦你访问它,你就可以通过它的 public API 获得当前速度:
public float getCurrVelocity();
使用反射从来都不是理想的,因为你不得不担心它会跨越 android 版本,但简单的隔离使用可能相对有效。 - 覆盖 fling() method in ScrollView 并实例化一个 OverScroller 以跟踪滚动。如果一切顺利,您的 Overscoller 将始终处于与 ScrollView 中的状态相同的状态。
像这样:
@Override
public void fling(int velocityY)
{
// Pass through fling to parent
super.fling(velocityY);
// Keep track of velocity using our own Overscoller instance
mOurOverscroller = mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0,
Math.max(0, bottom - height), 0, height/2);
}