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>

これをエミュレーターでテストすると、水平フリングがうまく機能します。しかし、Samsung Galaxy S2でテストすると、フリングは奇妙な動作をします。

を上下に動かすと、スクロールビューは正常に動き始めますが、停止する前に、最後に到達していなくても、バウンドして戻ります。これは、スクロールビューが任意のスクロールレベルでバウンスしているためです。

スクロールする(指を横に動かして停止する)だけで、スクロールは正常に行われます。

誰かがこれを経験しましたか?サムスンの実装にバグはありますか?

これを修正する方法について何かアイデアはありますか?

私のアプリはAndroid2.2をターゲットにしています。GalaxyS2には公式のSamsungandroid4.0.3があります。

前もって感謝します!

4

1 に答える 1

1

多くのテストの結果、Horizo​​ntalScrollViewのSamsungファームウェア(Galaxy S2 4.0.3)のバグであるという結論に達しました。

フリングジェスチャは、本来とは逆の方向に行われているようです。たとえば、左に押して移動し、画面を離すと、フリング効果(移動を続けて速度を落とす)が実行されます。 ... 右!

したがって、私の解決策は、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 に答える