2015-03-30 6 views
1

Im пытается поиграть с несколькими мультитачами в Android.Android multitouch View.OnTouchListener

У меня есть два RelativeLayout на экране, где я хотел бы получить события касания.

fooLayout = (RelativeLayout)findViewById(R.id.foo); 
fooLayout.setOnTouchListener(onTouchListener); 

barLayout = (RelativeLayout)findViewById(R.id.bar); 
barLayout.setOnTouchListener(onTouchListener); 

... 

View.OnTouchListener onTouchListener = new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
    ... 

Я попытался использовать OnTouchListener для каждого макета, но это, похоже, не работает вообще.

Я понял, что, поскольку метод onTouch получает вид, я мог бы разобраться с тем, как появилось текущее событие касания, и сэкономить идентификатор указателя.

int pointerId = event.getPointerId(event.getActionIndex()); 
int action = event.getActionMasked(); 
switch (action) { 
    case MotionEvent.ACTION_DOWN: 
    case MotionEvent.ACTION_POINTER_DOWN: 
      switch (v.getId()) { 
       case R.id.foo: 
        fooPointerId = pointerId; 
        break; 
       case R.id.bar: 
        barPointerId = pointerId; 
        break; 
} 

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

Я иду об этом неправильно?

Возможно ли это сделать или я должен положить OnTouchListener в верхний вид и выяснить, какой макет Im касается значения x/y события?

ответ

0

Я думаю, вы должны расширить относительную компоновку и реализовать onTouchEvent (MotionEvent ev) там, чтобы выяснить, какие указатели касаются того, какие дочерние представления (поместите foo и bar внутри вашей основной относительной макета/группы просмотра, которая реализует onTouchEvent).

IMO onTouch (View v, MotionEvent ev) позволяет регистрировать только один указатель за один раз, поэтому с помощью этого подхода может оказаться невозможным. Это link может помочь

+0

Я сделал быстрый тест, сделав 2 пользовательских представления при переопределении onTouchEvent. Если я коснусь и удерживаю один вид, а затем коснусь другого события, которое не будет отправлено. Все примеры, которые я видел до сих пор, включая ссылку, похоже, мультитач в одном представлении. Нет ли способа заставить его работать с несколькими видами? –

+0

Попробуйте расширить группу представлений, такую ​​как относительный макет, а затем в вашем XML поместите это как ваш корень и добавьте в него свои представления. Внесите onTouchEvent в корневой каталог. Я так думаю, что все дочерние представления будут подвергаться воздействию нескольких указателей. – trpride

+0

Итак, я должен был бы определить, какой вид находится при касании, используя значения x/y события в «root»? –