AbsListView потребляет сенсорные события - PullRequest
1 голос
/ 20 июня 2011

У меня есть ViewFlipper с несколькими GridViews в нем. Я хочу иметь возможность взаимодействовать с GridViews и проведите пальцем, чтобы переключиться с одной сетки на другую. Проблема в том, что я запускаю AbsListView, потребляет сенсорные события, возвращая true независимо от того, что он сделал. Я нашел этот пост , который предлагает мне попробовать onInterceptTouchEvent(), но это не работает. Поскольку я пытаюсь использовать GestureDetector, кажется, что он не может правильно отследить прикосновения.

Используя метод в этом посте, я использую onInterceptTouchEvent() для распечатки перехваченных касаний, но я не получаю MOTION_UP событий последовательно. Я вижу MOTION_DOWN, несколько MOTION_MOVE и нет MOTION_UP.

1 Ответ

0 голосов
/ 22 июня 2011

Хорошо, если кто-то ищет ответ на этот вопрос, вот решение, которое я придумала!Основная настройка состоит в том, что у меня есть FrameLayout, который содержит ViewFlipper, и я добавляю GridView s к ViewFlipper в зависимости от того, сколько предметов мне нужно показать.I обнаруживает пролистывание FrameLayout и переключается между GridView s в ViewFlipper.Мне все еще нужно иметь возможность щелкать элементы в GridView, поэтому я не могу просто использовать события в FrameLayout, но GridView потребляет все полученные события, поэтому мне пришлось перехватывать события, прежде чем они дойдут доGridView и отдаю их моему GestureDetector.

public class PagedGrid extends FrameLayout
{
    private Context _context;
    private ViewFlipper _flipper;
    private GestureDetector _gestureDetector;

    public PresentationsGrid(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);

        LayoutInflater.from(context).inflate(R.layout.presentation_grid, this, true);

        _flipper = (ViewFlipper)findViewById(R.id.flipper);
        _gestureDetector = new GestureDetector(new GestureListener());

        setFocusable(true);
        setFocusableInTouchMode(true);
        setClickable(true);

        _context = context;

        // ... Add Pages ...
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event)
    {
        return _gestureDetector.onTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        _gestureDetector.onTouchEvent(event);
        return false;
    }
}

Затем я подклассифицировал GridView, чтобы отслеживать его состояние и разумно передавать события назад.

public class UnNomableGridView extends GridView
{
    private boolean _wasDown;

    public UnNomableGridView(Context context)
    {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        if(!_wasDown && event.getActionMasked() == MotionEvent.ACTION_DOWN)
        {
            super.onTouchEvent(event);
            _wasDown = true;
            return true;
        }
        else if(_wasDown && event.getActionMasked() == MotionEvent.ACTION_UP)
        {
            super.onTouchEvent(event);
            _wasDown = false;
            return true;
        }
        else if(_wasDown && event.getActionMasked() == MotionEvent.ACTION_CANCEL)
        {
            super.onTouchEvent(event);
            _wasDown = false;
            return true;
        }
        else
        {
            return false;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...