Проблемы с жестом пролистывания и Android ListActivity: жест броска активирует базовые элементы списка - PullRequest
0 голосов
/ 25 августа 2011

Я пытаюсь реализовать жест броска смахивания в списке действий. Это работает, но проблема в том, что сенсорные события также активируют элементы в списке!

Я искал другие ответы, но, к сожалению, не нашел работающего решения. Вот код, который я использую:

В списке активность:

// Setup the swipe detector
mSwipeGestureListener = new SwipeGestureListener(this);
mGestureDetector = new GestureDetector(mSwipeGestureListener);
mGestureDetector.setIsLongpressEnabled(false);

@Override
public boolean dispatchTouchEvent(final MotionEvent ev)
{
    boolean handled = false;

    if (mGestureDetector != null)
    {
        handled = mGestureDetector.onTouchEvent(ev);
    }

    handled |= super.dispatchTouchEvent(ev);

    return handled;
}

А вот код моего слушателя жестов:

  public class SwipeGestureListener extends GestureDetector.SimpleOnGestureListener
  {
    protected final Activity mActivity;
    protected final int mTouchSlop;
    protected final int mMinimumSwipeVelocity;

    public SwipeGestureListener(final Activity activity)
    {
        mActivity = activity;
        final ViewConfiguration viewConfiguration = ViewConfiguration.get(activity);

        mTouchSlop = viewConfiguration.getScaledTouchSlop();
        mMinimumSwipeVelocity = viewConfiguration.getScaledMinimumFlingVelocity();
    }

    @Override
    public boolean onFling(final MotionEvent e1, final MotionEvent e2, final float velocityX, final float velocityY)
    {
        // Don't handle swipe if Y offset is greater than touch slop
        if (Math.abs(e1.getY() - e2.getY()) > mTouchSlop)
        {
            return false;
        }
        else
        {
            if (e1.getX() - e2.getX() > mTouchSlop
             && -velocityX > mMinimumSwipeVelocity)
            {
                // User swiped finger left.
                onSwipeToLeft();
            }
            else if (e2.getX() - e1.getX() > mTouchSlop
             && velocityX > mMinimumSwipeVelocity)
            {
                // User swiped finger left.
                onSwipeToRight();
            }

            // We're interested in these series of events
            return true;
        }        
    }

    // It is necessary to return true from onDown for the onFling event to register
    @Override
    public boolean onDown(final MotionEvent e)
    {
        return true;
    }

    protected void onSwipeToLeft() {}

    protected void onSwipeToRight() {};
   }

Я полностью в тупике. Как же я могу обрабатывать жесты в Android без жестов, также активируя основные элементы в списке!

P.S. Использование view.setOnTouchListener в корневом макете не приводило к получению сенсорных событий; вот почему я использовал dispatchTouchEvent.

Любая помощь будет высоко ценится.

Спасибо!

1 Ответ

0 голосов
/ 26 августа 2011

Это не полное решение, но я смог обойти проблему с помощью следующих изменений кода:

Вместо использования dispatchEvent я делаю это:

    getListView().setOnTouchListener(new View.OnTouchListener() 
    {
        @Override
        public boolean onTouch(final View v, final MotionEvent me)
        {
            boolean handled = false;

            if (mGestureDetector != null)
            {
                handled = mGestureDetector.onTouchEvent(me);
            }

            return handled;
        }
    });

Я улучшил жест кидания следующим образом:

    @Override
    public boolean onFling(final MotionEvent e1, final MotionEvent e2, final float velocityX, final float velocityY)
    {        
        if (e1 != null && e2 != null)
        {
            final float length = Math.abs(e1.getX() - e2.getX());
            final float height = Math.abs(e1.getY() - e2.getY());

            // Accept criteria: X movement more than or equal to touch slop, total
            // slope <= 50%
            if (length < mTouchSlop || height / length > 0.50)
            {
                return false;
            }
            else
            {
                if (-velocityX > mMinimumSwipeVelocity)
                {
                    // User swiped finger left.
                    onSwipeToLeft();
                }
                else if (velocityX > mMinimumSwipeVelocity)
                {
                    // User swiped finger right.
                    onSwipeToRight();
                }

                // We're interested in these series of events
                return true;
            }
        }
        else
        {
            return false;
        }
    }

И я удалил переопределение onDown (), которое возвращало true, потому что это испортило прокрутку на ListView.

Надеюсь, что это может помочькто-то еще там.

...