Непрерывное сенсорное событие в Android - PullRequest
0 голосов
/ 10 августа 2011

У меня есть 4 кнопки на активность.Я установил Touch Listeners для всех кнопок.

Button1.setOnTouchListener(this);
Button2.setOnTouchListener(this);
Button3.setOnTouchListener(this);
Button4.setOnTouchListener(this);

Все, что я хочу сделать, - это получить MotionEvent.ACTION_DOWN и MotionEvent.ACTION_UP, когда я перемещаю палец по кнопкам.

Я получаю этисобытия, когда я касаюсь ИНДИВИДУАЛЬНЫХ кнопок, , но не когда я перемещаю палец от одной кнопки к другой.

В этом случае первая кнопка должна получить сообщение ACTION_UP иследующая кнопка должна получить сообщение ACTION_DOWN.

Пожалуйста, помогите.

Ответы [ 3 ]

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

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

Что, если вы разделите сенсорные обработчики на четыре отдельные функции, подобные этой, - таким образом,все кнопки имеют независимые сенсорные обработчики, и нет коллизий, поскольку все они используют одну и ту же функцию для обработки своих коллективных событий.Создайте отдельный «onTouchEventListener» для каждой кнопки и сделайте так, чтобы он выглядел следующим образом:

Button1.setOnTouchListener(button1Listener);
Button2.setOnTouchListener(button2Listener);
Button3.setOnTouchListener(button3Listener);
Button4.setOnTouchListener(button4Listener);

Вот как это сделать из документации для Android:

// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
       // do something when the button is clicked
    }
};

protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(mCorkyListener);
   ...
}
0 голосов
/ 10 августа 2011

Поскольку вы пытаетесь захватить MotionEvent, который включает в себя все кнопки, а не одну, вам нужно будет захватить MotionEvents в родительском представлении, а затем отправить их дочерним кнопкам в виде MotionEvent.ACTION_DOWN.затем MotionEvent.ACTION_UP.

Я сделал нечто подобное, чтобы сделать мультитач-клавиатуру из RelativeLayout, содержащего много кнопок.Я в основном переопределил dispatchTouchEvent и отслеживал каждый палец, отправляя ACITON_DOWN и ACTION_UP вместо ACTION_POINTER_DOWN и ACTION_POINTER_UP для вторичных пальцев для детей.

Может быть полезно взглянуть на источник ViewGroup и посмотрите, как она отправляет события своим дочерним элементам, и настройте поведение, чтобы проверить, когда палец выходит за пределы дочерних кнопок, и, если это так, отправьте ACTION_UP на старую кнопку, а затем ACTION_DOWN нановая кнопка.

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

В таком поведении каскадеров есть определенная логика.

Я думаю, что лучшим решением для вас будет установить OnTouchListener для родительского представления Button1, Button2 и т. Д. Или переопределить метод OnTouchEvent(). После этого вы сможете отправлять MotionEvent дочерним видам (кнопки в вашем случае) вручную, когда это необходимо.

...