2013-02-24 2 views
3

Я получаю наготу с помощью OnTouchEvent. Я хочу обнаружить только 5 пальцев. Как я могу это достичь? Также проблема заключается в том, что она вызывает несколько раз. Вот мой код:OnTouchEvent Проблема Android

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 

    int pointerCount = event.getPointerCount(); 

    System.out.println("My pointer....." + pointerCount); 

    final int action = event.getAction(); 

     if(action == MotionEvent.ACTION_UP) { 

      if(pointerCount >= 4){ 


      Log.d("MyActivity", "in onTouchEvent!"); 
      Toast.makeText(MyclassActivity.this, "Finger !!"+pointerCount,Toast.LENGTH_SHORT).show(); 

      Intent z = new Intent(MyclassActivity.this, 
         DashboardActivity.class); 
       startActivity(z); 
      finish(); 
      }  

    } 

     return super.onTouchEvent(event); 
    } 

Я не доволен этой штукой. позвольте мне принять вашу помощь, чтобы получить и сосчитать точные 5 пальцев и избегать многократного призыва к onTouchevent.

Спасибо,

+3

Я думаю, вы не понимаете, что такое событие касания. Это не щелчок по экрану. Если вы переместите какой-либо палец или измените давление, вызывается 'onTouchEvent'. – abc667

+0

Метод onTouch предназначен для вызова всякий раз, когда на экране появляется действие, поэтому вы не можете избежать нескольких вызовов. Почему вы не удовлетворены здесь? –

+0

Попробуйте эту ссылку http://android-developers.blogspot.in/2010/06/making-sense-of-multitouch.html –

ответ

2

Я считаю, что MotionEvent.ACTION_POINTER_UP вызывается каждый раз, когда вы удалите один палец с экрана. Поэтому, если вы коснетесь экрана 5 пальцами, он вернется более чем 1 раз. Попробуйте использовать MotionEvent.ACTION_UP в вашей реализации. Граф все пальцы -> проверить, когда MotionEvent.ACTION_UP называется -> вы закодировать только тогда, когда наибольшее количество пальцев было 5.

int maxPointercount; 
int previousPointercount; 

@Override 
    public boolean onTouch(View v, MotionEvent event) { 

    int currentpointerCount = event.getPointerCount(); 

    Log.d("1", "My pointer = " + currentpointerCount); //what does it say here? 

    final int action = event.getAction(); 
      switch (action & MotionEvent.ACTION_MASK) { 
       case MotionEvent.ACTION_POINTER_DOWN:   
       if(maxPointercount <= previousPointercount){ 
       maxPointercount = currentpointerCount; 
       } 
       previousPointercount = currentpointerCount; 
      } 

    if(action == MotionEvent.ACTION_UP) { 
     Log.d("3", maxPointercount + " = maxPointercount"); 
     if(maxPointercount == 5){ //or whatever amount of fingers, try it out. 

      //your code that will run 1 time 

     } 
      maxPointercount = 0; 
      previousPointercount = 0;  

    } 
    return super.onTouchEvent(event); 
} 

Edit: Фиксированный это снова! Теперь это действительно работает.

+0

Я использовал это !! Но тогда он не может получить указатель! Он будет работать, если я коснусь только одного пальца! – Mahi

+0

Как вы сказали, я обновил свой код здесь! Это не работает!! См. Выше код и позвольте мне обратиться за помощью! – Mahi

+0

Вам нужно будет сделать больше, чем просто заменить эту единственную строку брата кода! ACTION_UP отправляется, когда последний палец покидает экран, в этот момент вам нужно знать, какое наибольшее количество пальцев было в то время, когда вы коснулись экрана и выпустили все пальцы. Если это 5, запустите свой код. –

1

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

public boolean onTouchEvent(MotionEvent event){ 
    int eventaction = event.getAction(); 
    String str= ""; 
    //touch Events, i came up with the mask 5 by trial, hope it works for all devices 
    //eventaction == 0 match the first touch event ever 
    if((eventaction & 5) == 5 || eventaction == 0){ 
     str= "Touch Event"; 
    } 
    //Release Event, i came up with the mask 6 by trial, hope it works for all devices 
    //eventaction == 1 match the last release event ever, this makes it hard to know wich finger was removed 
    if((eventaction & 6) == 6 || eventaction == 1){ 
     str= "Release Event:"; 
    } 
    if(eventaction == 2){ 
     str= "Move Event:"; 
     return true;//it will make a mess in the logcat, if u want remove this line 
    } 
    str += " With Number Of fingers " + event.getPointerCount() ; 
    str += ", the finger triggered the event is : finger "; 
    //some stupid thing i have done, but it works 
    //these numbers was made based on the binary mask that i was able to figure out 
    //but it still has an issue with the last finger removed as its eventaction is always 0, but this can be pragmatically known by monitoring each finger touch and release 
    switch (eventaction){ 
    case 0: 
    case 5: 
    case 6: 
     str += "1"; 
     break; 
    case 261: 
    case 262: 
     str += "2"; 
     break; 
    case 517: 
    case 518: 
     str += "3"; 
     break; 
    case 773: 
    case 774: 
     str += "4"; 
     break; 
    case 1029: 
    case 1030: 
     str += "5"; 
     break; 
    case 1285: 
    case 1286: 
     str += "6"; 
     break; 
    case 1541: 
    case 1542: 
     str += "7"; 
     break; 
    case 1797: 
    case 1798: 
     str += "8"; 
     break; 
    case 2053: 
    case 2054: 
     str += "9"; 
     break; 
    case 2309: 
    case 2310: 
     str += "10"; 
     break; 
    } 
    Log.d("Test", str); 
    return true; 
} 

Надеется, что это помогает кто-нибудь, если вы до сих пор не хватаете информацию, то я буду рад помочь^_ ^.

Смежные вопросы