2

我有一个带有 Horizo​​ntalScrollView 和 Horizo​​ntal-LinearLayout 的简单布局,如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <HorizontalScrollView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:scrollbars="horizontal"
        android:fadingEdge="none">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="horizontal">

            <TextView
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sed velit sed nisl pharetra consequat"/>
            <TextView
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sed velit sed nisl pharetra consequat"/>
            <TextView ... (same text view repeated several times) />

        </LinearLayout>

    </HorizontalScrollView>

</RelativeLayout>

当我在模拟器上进行测试时,水平投掷效果很好。但是在三星 Galaxy S2 上进行测试,fling 的行为很奇怪:

当手指向侧向上移动时,滚动视图开始正常滚动,但在停止之前,它会弹回并向后移动,尽管它还没有到达终点。就像滚动视图在任何滚动级别弹跳一样。

如果我只是滚动(将手指移动到侧面停止和向上),滚动就可以了。

有没有人经历过这个?三星实施中是否有任何错误?

有想法该怎么解决这个吗?

我的应用程序针对的是 android 2.2。Galaxy S2 拥有三星官方安卓 4.0.3。

提前致谢!

4

1 回答 1

1

经过大量测试后,我得出结论,这是三星固件(Galaxy S2 4.0.3)上的一个错误,位于 Horizo​​ntalScrollView 上。

似乎正在向相反的方向做出甩动手势:例如,如果我按下并向左移动,然后松开屏幕,则甩动效果(继续移动并减速)完成到... 正确的!

所以我的解决方案是继承Horizo​​ntalScrollView,并添加一个补丁以确保如果向右滚动,则向右移动,反之亦然。

public class PatchedHorizontalScrollView extends HorizontalScrollView {
    public PatchedHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    public PatchedHorizontalScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public PatchedHorizontalScrollView(Context context) {
        super(context);
    }

    // store most recent scroll X positions
    int olderScrollX = 0;
    int lastScrollX = 0;

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // keep track of most recent scroll positions
        olderScrollX = lastScrollX;
        lastScrollX = getScrollX();

        return super.onTouchEvent(ev);
    }

    @Override
    public void fling(int velocityX) {
        // ensure velocityX has the right sign
        if (lastScrollX > olderScrollX) {
            // to the right: velocity must be positive
            if (velocityX < 0) {
                velocityX = -velocityX;
            }
        } else if (lastScrollX < olderScrollX) {
            // to the left: velocity must be negative
            if (velocityX > 0) {
                velocityX = -velocityX;
            }
        }

        super.fling(velocityX);
    }
}
于 2012-12-19T11:14:36.070 回答