android Horizo​​ntalScrollView在三星设备上投放

时间:2012-11-29 21:08:36

标签: android horizontalscrollview

我有一个使用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表现得很奇怪:

当手指移动侧向和向上时,滚动视图开始投掷正常,但在停止之前,它会反弹并向后移动,尽管它有 NOT 走到了尽头。滚动视图在任何滚动级别都会弹跳。

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

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

有关如何解决此问题的任何想法?

我的应用是针对Android 2.2。 Galaxy S2有官方的三星Android 4.0.3。

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

看起来fling-gesture正朝着相反的方向发展: 例如,如果我向左移动并向左移动,然后释放屏幕,那么投掷效果(继续移动和减速)就完成了......正确!

所以我的解决方案一直是子类化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);
    }
}