Désactiver ou prévenir l'activité multitouch
j'ai plusieurs vues sur une activité qu'un utilisateur veut toucher rapidement dans la succession et je capture ces touches en utilisant un TouchListener
et la manipulation MotionEvent.ACTION_DOWN
. Cependant, si l'utilisateur utilise deux mains, il est très probable que la vue suivante sera "touchée" avant que l'utilisateur ne relève le doigt précédent. Dans ce scénario, un MotionEvent.ACTION_MOVE
est déclenché pour la première vue plutôt que l'option MotionEvent.ACTION_DOWN
pour la seconde vue.
y a-t-il un moyen de travailler autour ou prévenir ce comportement? J'ai essayé l'envoi d'un nouvel événement avec MotionEvent.ACTION_UP
et aussi enlever l'écouteur d'événement, mais ils ne semblent travailler.
8 réponses
la façon la plus facile que j'ai trouvé pour forcer simple touch à travers une application entière est de la mettre en utilisant un thème:
<style name="MyTheme" parent="@android:style/Theme.Holo.Light">
<item name="android:windowEnableSplitTouch">false</item>
<item name="android:splitMotionEvents">false</item>
</style>
manifeste:
<application
android:label="@string/app_name"
android:theme="@style/MyTheme" >
si quelqu'un cherche toujours la meilleure solution, mettez dans le xml le code suivant:
android:splitMotionEvents = false
Je l'ai fait comme ceci:
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if(event.getPointerCount() > 1) {
System.out.println("Multitouch detected!");
return true;
}
else
return super.onTouchEvent(event);
}
je pense que vous pouvez outrepasser onTouchEvent pour n'importe quelle vue.
la meilleure façon de contourner ce scénario est d'utiliser un ViewGroup
et d'implémenter la méthode onInterceptTouchEvent
pour router manuellement les événements tactiles comme bon vous semble.
: Android multitouch! pirater quelqu'un?
Le Codeimplémentant cette solution (trouvé dans la section Commentaires de la réponse à la question ci-dessus) se trouve ici: http://pastebin.com/hiE1aTCw
j'ai résolu cela en utilisant une méthode personnalisée - ce que je ne voulais pas faire si quelqu'un trouve une meilleure façon, je voudrais en entendre parler merci:
public static void setViewGroupEnebled(ViewGroup view, boolean enabled)
{
int childern = view.getChildCount();
for (int i = 0; i< childern ; i++)
{
View child = view.getChildAt(i);
if (child instanceof ViewGroup)
{
setViewGroupEnebled((ViewGroup) child,enabled);
}
child.setEnabled(enabled);
}
view.setEnabled(enabled);
}
Remplacer dispatchTouchEvent et d'intercepter toutes les touches y, pour toutes les touches de la pointercount est plus un.
if(ev.getPointerCount() > 1)
{
Log.d("Multitouch detected!");
ev.setAction(MotionEvent.ACTION_CANCEL);
}
Ceci annule les touches et efface l'état pressé des boutons sans prendre aucune autre mesure.
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) {
horizentalLinearGridItem.setMotionEventSplittingEnabled(false);
}
ici horizentalLinearGridItem est parentLayout view où nous insérons le point de vue des enfants. Dans mon code, sa linéarité. Dans cette linéarité j'ai ajouté des opinions d'enfant. Mais quand j'ai cliqué sur deux opinions d'enfant simultanément, les deux obtenaient les événements. Pour bloquer ça, j'ai utilisé le code ci-dessus.
Je l'ai obtenu pour travailler pour moi en ajoutant juste un peu de code dans OnTouchEvent
méthode,
boolean action_down_required = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
if(event.getPointerCount() > 1){
action_down_required = true;
return true;
}
if(action_down_required){
action = MotionEvent.ACTION_DOWN;
}
switch (action) {
case MotionEvent.ACTION_DOWN:
// your code goes here...
action_down_required = false;
break;
// Other events...