Выбор других кнопок при сенсорном перемещении

Я пишу тест, какие параметры помещаются в кнопки. У меня есть селектор для кнопок, который отображает нормальное и нажатое состояние, и все отлично работает. Я хочу, чтобы когда пользователь касался опции и переходил к следующей опции, следующая кнопка получала фокус и выбирала. И когда пользователь возьмет руку, выполните щелчок выбранной кнопки.

пользователь коснется одного из вариантовпользователь переходит к следующему варианту

На изображениях выше вы можете видеть именно то, что я имею в виду.


person hojjat reyhane    schedule 02.02.2015    source источник


Ответы (1)


Вам нужно написать пользовательское управление событиями касания, которое будет запускать setPressed(true) в MotionEvent.ACTION_DOWN ИЛИ MotionEvent.ACTION_MOVE (реализация по умолчанию предполагает всегда получать MotionEvent.ACTION_DOWN).

Такой код должен работать (добавьте его ко всем кнопкам):

button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                if (!v.isPressed()) {
                    v.setPressed(true);
                }
                return true;
            case MotionEvent.ACTION_UP:
                // perform action ON CLICK
                break;
        }

        v.setPressed(false);
        return false;
    }
});
person Bartek Lipinski    schedule 02.02.2015
comment
это решение не работает, потому что при перемещении касания это только для кнопки, которую пользователь запускает оттуда, и другие кнопки не будут реагировать на нее. - person hojjat reyhane; 02.02.2015
comment
ты хоть пробовал? Важная часть заключается в том, что когда палец пересекает границу кнопки, сенсорная область MotionEvent.Action_CANCEL должна вызываться на этой кнопке, а затем в примере, который я предоставил, слушатель onTouch вернет false. Благодаря этому управление сенсорными событиями будет передано другим компонентам. - person Bartek Lipinski; 02.02.2015
comment
да я пробовал. проблема в том, что MotionEvent.Action_CANCEL не вызывается, когда касание оставляет кнопку. на самом деле отмена никогда не звонила на связь, я зарегистрировалась, и я не знаю, почему. - person hojjat reyhane; 02.02.2015
comment
Эти кнопки хранятся в каком-то ScrollView? - person Bartek Lipinski; 02.02.2015
comment
Что ж, мне нужно проверить код, чтобы найти настоящую причину, по которой событие не вызывается тогда... Другой подход, который вы можете использовать, - это добавить прослушиватель onTouchEvent к вашему LinearLayout вместо ваших кнопок. Внутри этого прослушивателя, если запускается событие MOVE или DOWN, вы находите правильный View для этого события (на основе координат события касания), устанавливаете его состояние нажатия на true, а для всех остальных состояний нажатия — false. При обнаружении MotionEvent.Action_UP выполните действие по щелчку для правильного View. - person Bartek Lipinski; 02.02.2015
comment
да, это верный ответ, я работал над ним около 3 часов и исправил. цель этого вопроса заключалась в том, чтобы спросить, существует ли какое-либо более простое решение. спасибо, что поделились своими знаниями. - person hojjat reyhane; 02.02.2015
comment
Есть ли здесь какое-нибудь решение для этого? - person Amit Sharma; 21.11.2016