4

ユーザーのジェスチャーが特定の ListView の行で行われた場合、ユーザーのジェスチャーに応答するために ListView を停止する必要があります。対象の ListView の行ビューには onTouchListener が設定されており、ListView の上下スクロールのためにスワイプ/フリップを認識できません。したがって、指を少し上下に動かすと、ListView がそれをインターセプトし、対応する方向にスクロールします。したがって、Y座標が一定量以上変化した場合のように、どういうわけかそれをルール化する必要があります-ListViewをスクロールさせ、そうでない場合-ジェスチャをフリング/スワイプとして認識させます。OnTouchListener は

private int SWIPE_MIN_DISTANCE = 1;
private int SWIPE_MAX_OFF_PATH = 300;

final OnTouchListener flingSwipeListener =  new OnTouchListener() {
    float touchX;
    float touchY;
    @Override
    public boolean onTouch(final View view, final MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN)
        {
            touchX = event.getX();
            touchY = event.getY();
        }
        else if (event.getAction() == MotionEvent.ACTION_UP)
        {                   
        if (Math.abs(touchY - event.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
            // right to left swipe
            else if (touchX - event.getX() > SWIPE_MIN_DISTANCE){
                    Log.i("flingSwipe","right to left swipe");
            } 
            // left to right swipe
            else if (event.getX() - touchX > SWIPE_MIN_DISTANCE){
                    Log.i("flingSwipe","left to right swipe");
            }
        }
        return true;

    }
};

この onTouchListner は、1 つの特定の行に設定されました。onTouchListener がジェスチャを認識している間は ListView をフリーズする必要がありますが、失敗した場合は MotionEvent を ListView に送信する必要があります。

4

2 に答える 2

1

水平スクロール (スワイプ) が検出されたときに ListView の垂直スクロールを無効にする場合は、次の解決策を使用します。カスタム ListView クラスで onTouchEvent をオーバーライドし、アクション MotionEvent.ACTION_MOVE を MotionEvent.ACTION_CANCEL に置き換えます。

public class ListView2 extends ListView
{
    private enum ScrollDirection
    {
        Horizontal,
        Vertical
    }

    private final int touchSlop;

    private float downX = 0;
    private float downY = 0;

    private ScrollDirection scrollDirection;

    public ListView2(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev)
    {
        switch (ev.getActionMasked())
        {
            case MotionEvent.ACTION_MOVE:
                if (scrollDirection == null)
                {
                    if (Math.abs(downX - ev.getX()) > touchSlop) scrollDirection = ScrollDirection.Horizontal;
                    else if (Math.abs(downY - ev.getY()) > touchSlop) scrollDirection = ScrollDirection.Vertical;
                }
                if (scrollDirection == ScrollDirection.Horizontal) ev.setAction(MotionEvent.ACTION_CANCEL);
                break;

            case MotionEvent.ACTION_DOWN:
                scrollDirection = null;
                downX = ev.getX();
                downY = ev.getY();
                break;

        }
        return super.onTouchEvent(ev);
    }
}

もちろん、垂直スクロールを無効にするかどうかのチェック ロジックをより複雑にすることもできます。

于 2014-10-15T12:53:57.177 に答える