我有一个ScrollView,它正在工作,我能够到达底部并回到顶部。问题在于,当用户从屏幕上移开手指时,滚动会立即停止。它本来应该更平滑,而且不累人。谁能帮我吗?
这是我的代码:
XML:
<ScrollView
android:id="@+id/home_content_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/color_background_default"
android:fadingEdgeLength="@dimen/app_fading_edge_length" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/color_background_default"
android:orientation="vertical"
android:padding="@dimen/app_content_padding" >
<!-- Lots of different components here -->
</LinearLayout>
</ScrollView>
我尝试做scrollView.setSmoothScrollingEnabled(true);
但这也不起作用。
另一件事,我显示了呈现scrollView的主要内容之后异步获取的一些内容。其中一些是图像,可能会影响滚动的总高度...考虑到我做了
scrollView.refreshDrawableState();
scrollView.requestLayout();
根本没用...
今天,我遇到了类似的问题。在我的特殊情况下,我在ScrollView中有一个RecyclerView。经过一段时间的试验,我发现ScrollView没有任何问题。这是RecyclerView内部负责的。所以我做到了:
myRecyclerView.setNestedScrollingEnabled(false); /** THIS is the line that makes Recyclerview inside scrollview to scroll smoothly!*/
也许您应该检查其他元素。Reference
如果您不喜欢在松开手指以停止滚动时Android如何处理它,则可以像这样重载该逻辑:
ScrollView myScrollView = (ScrollView) findViewById(R.id.my_scrollview_id);
myScrollView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
} else {
mVelocityTracker.clear();
}
mVelocityTracker.addMovement(event);
break;
case MotionEvent.ACTION_MOVE:
mVelocityTracker.addMovement(event);
mVelocityTracker.computeCurrentVelocity(1000);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
((ScrollView)v).smoothScrollBy(0, (int) (mVelocityTracker.getYVelocity()*myScalarMultiple));
return true;
}
return false;
}
});
我们为ACTION_DOWN和ACTION_MOVE返回“ false”,因为我们只是想影响速度跟踪器,而不是消耗ScrollView的触摸事件。您还必须尝试使用myScalarMultiple
的值来获得所需的结果。
将scrollview包装在布局内,它将可以正常工作
下面提供示例代码供参考
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ScrollView android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</ScrollView>
</LinearLayout>