2017-06-03 2 views
1

J'ai une application avec des boutons et j'essaie de gérer des événements multitouch. Actuellement, j'utilise la méthode On Touch et je recherche MotionEven.ACTION_DOWN et MotionEven.ACTION_UP pour suivre les événements tactiles. Cela fonctionne bien si deux boutons sont touchés en même temps. Cependant, je veux que les boutons aient un comportement quand on les touche avec un seul doigt et un comportement différent lorsqu'on les touche avec plus de doigts. Par exemple, si vous touchez un bouton avec un doigt, ce bouton devient rouge, si vous touchez un bouton avec 2 doigts, ce bouton devient jaune, si vous touchez un bouton avec 3 doigts, il devient vert, et ainsi de suite.Touches multiples sur un seul bouton Android

Le problème que je rencontre est que lorsque je touche un bouton avec plus d'un doigt, le second contact ne semble pas déclencher un événement. Comment puis-je détecter plusieurs touches sur le même bouton?

+0

https://github.com/devunwired/custom-touch-examples ce référentiel peut vous aider. – Raghunandan

+0

Quel exemple exact je recherche? – user381261

Répondre

0

Ceci est la base de ce que vous voulez. Il peut ne pas être complètement ce que vous voulez, car il doit y avoir un certain espace entre les doigts pour les MotionEvent s que j'avais l'habitude d'être reconnu. Si 2 doigts sont rapprochés, cela donne ACTION_MOVE comme MotionEvent. Si vous en avez vraiment besoin, vous pouvez peut-être interpréter ces & pour déterminer si 2 doigts ou plus sont rapprochés. MotionEvent

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    private static final int MAX_TOUCHES = 3; 

    private View buttonView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     buttonView = findViewById(R.id.button_view); 
     buttonView.setOnTouchListener(new View.OnTouchListener() { 
      boolean eventConsumed = false; 

      // Only handling these 4 events means that there must be some space 
      //  between fingers when touching 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 
       Log.d(TAG, "" + motionEvent.toString()); 
       switch (motionEvent.getActionMasked()) { 
        case MotionEvent.ACTION_DOWN: 
        case MotionEvent.ACTION_POINTER_DOWN: 
         setButtonColor(motionEvent.getPointerCount()); 
         eventConsumed = true; 
         break; 

        case MotionEvent.ACTION_UP: 
        case MotionEvent.ACTION_POINTER_UP: 
         // subtract 1 from the count, this event still includes the touch just removed 
         setButtonColor(motionEvent.getPointerCount() - 1); 
         eventConsumed = true; 
         break; 

        default: 
         break; 
       } 

       return eventConsumed; 
      } 
     }); 
    } 

    private void setButtonColor(int count) { 
     Log.d(TAG, "count = " + count); 

     if(count < 0) { 
      count = 0; 
     } else if(count > MAX_TOUCHES) { 
      count = MAX_TOUCHES; 
     } 

     switch (count) { 
      case 0: 
       buttonView.setBackgroundColor(getButtonColor(R.color.colorNotPressed)); 
       break; 

      case 1: 
       buttonView.setBackgroundColor(getButtonColor(R.color.colorRed)); 
       break; 

      case 2: 
       buttonView.setBackgroundColor(getButtonColor(R.color.colorYellow)); 
       break; 

      case 3: 
       buttonView.setBackgroundColor(getButtonColor(R.color.colorGreen)); 
       break; 

      default: 
       break; 
     } 
    } 

    // This keeps you from getting a warning about getResources().getColor() being deprecated 
    @SuppressWarnings(value = "deprecation") 
    private int getButtonColor(int id) { 
     int color; 

     if(Build.VERSION.SDK_INT >= 23) { 
      color = getColor(id); 
     } else { 
      color = getResources().getColor(id); 
     } 
     return color; 
    } 
} 

activity_main.xml (non compris AppBar ou substance FAB)

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/colorPrimary" 
    > 

    <View 
     android:layout_width="250dp" 
     android:layout_height="250dp" 
     android:layout_centerInParent="true" 
     android:text="Big Button" 
     android:background="@color/colorNotPressed" 
     android:id="@+id/button_view" 
     /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:text="Big Button" 
     android:textSize="20sp" 
     /> 

</RelativeLayout> 

Avec ceux-ci dans votre fichier Colors.xml

<color name="colorNotPressed">#606060</color> 
<color name="colorRed">#FF0000</color> 
<color name="colorYellow">#FFFF00</color> 
<color name="colorGreen">#00FF00</color>