1

ユーザーが Android ScrollView でスクロールできないようにしたいのですが、スクロール ビュー内にあるボタンをタップすると検出されます。

私は ScrollView クラスをサブクラス化し、メソッドonInterceptTouchEventonTouchEventメソッドをいじっていますが、完全に正しく理解できないようです。以下のコードはスクロールを停止しますが、タップを無効にしているようです (ただし、何も動かさずに上下に移動する場合は機能しますが、タップ時に指がわずかに動く場合は登録されません)。またonInterceptTouchEvent、ほとんど機能する も削除しましたが、ユーザーが指を離してもスクロールビューはスクロールします。

    @オーバーライド
    public boolean onInterceptTouchEvent(MotionEvent ev)
    {
        App.log("onInterceptTouchEvent、アクション: " + ev.getAction());
        スイッチ (ev.getAction())
        {
            ケース MotionEvent.ACTION_MOVE:
                true を返します。
        }
        super.onInterceptTouchEvent(ev) を返します。

    }

    @オーバーライド
    public boolean onTouchEvent(MotionEvent ev)
    {
        App.log("onTouchEvent、アクション: " + ev.getAction());
        スイッチ (ev.getAction())
        {
            ケース MotionEvent.ACTION_MOVE:
                false を返します。
        }
        super.onTouchEvent(ev) を返します。
    }

4

2 に答える 2

2

最終的に、次のソリューションがまさに私が必要としていたものであることがわかりました。

@Override
public boolean onTouchEvent(MotionEvent ev)
{
    App.log("onTouchEvent, with action : " + ev.getAction());
    switch(ev.getAction())
    {
        case MotionEvent.ACTION_MOVE:
            return false;
    }
    return super.onTouchEvent(ev);
}
于 2013-11-07T12:23:07.327 に答える
1

overscrollBy()無効になっている場合は、deltaX と deltaY の値をオーバーライドして 0 に変更できます。

@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent)
{
    final int dx;
    final int dy;

    if (isEnabled())
    {
        dx = deltaX;
        dy = deltaY;
    }
    else
    {
        dx = 0;
        dy = 0;
    }

    return super.overScrollBy(dx, dy, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
}

おそらく、無効化/有効化時にスクロールバーも動的に非表示/表示する必要があります。

于 2013-10-31T07:55:20.423 に答える