Android - ScrollView slugging

时间:2014-07-03 23:01:59

标签: android scrollview smooth-scrolling

我有一个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();

这根本不起作用......

3 个答案:

答案 0 :(得分:1)

今天,我遇到了类似的问题。在我的特殊情况下,我在ScrollView中有一个RecyclerView。经过一段时间的试验,我发现ScrollView没有任何问题。这是RecyclerView内部负责的。所以我做到了:

myRecyclerView.setNestedScrollingEnabled(false); /** THIS is the line that makes Recyclerview inside scrollview to scroll smoothly!*/

也许您应该检查其他元素。 Reference

答案 1 :(得分:0)

如果您不喜欢在移除手指以停止滚动时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的值来获得您喜欢的结果。

答案 2 :(得分:0)

将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>