singletap touch détecter dans Ontouch méthode de la vue
J'avais besoin d'un singletap touch détecter dans mon affichage personnalisé du ontouch méthode. J'ai essayé d'obtenir les valeurs x et y dans les deux ACTION-BAS et de l'ACTION et dans l'ACTION, j'ai donné une condition que si les valeurs de X et Y dans ACTIONDOWN et l'ACTION sont égaux alors le prendre comme un seul robinet.
Mon code est comme suit
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (!mSupportsZoom && !mSupportsPan) return false;
mScaleDetector.onTouchEvent(ev);
final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
final float x = ev.getX();
final float y = ev.getY();
mLastTouchX = x; //here i get x and y values in action down
mLastTouchY = y;
mActivePointerId = ev.getPointerId(0);
break;
}
case MotionEvent.ACTION_MOVE: {
final int pointerIndex = ev.findPointerIndex(mActivePointerId);
final float x = ev.getX(pointerIndex);
final float y = ev.getY(pointerIndex);
if (mSupportsPan && !mScaleDetector.isInProgress()) {
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
mPosX += dx;
mPosY += dy;
//mFocusX = mPosX;
//mFocusY = mPosY;
invalidate();
}
mLastTouchX = x;
mLastTouchY = y;
break;
}
case MotionEvent.ACTION_UP: {
final float x = ev.getX();
final float y = ev.getY();
touchupX=x; //here is get x and y values at action up
touchupY=y;
if(mLastTouchX == touchupX && mLastTouchY == touchupY){ //my condition if both the x and y values are same .
PinchZoomPanActivity2.tapped1(this.getContext(), 100); //my method if the singletap is detected
}
else{
}
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_CANCEL: {
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_POINTER_UP: {
final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
>> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = ev.getPointerId(pointerIndex);
if (pointerId == mActivePointerId) {
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mLastTouchX = ev.getX(newPointerIndex);
mLastTouchY = ev.getY(newPointerIndex);
mActivePointerId = ev.getPointerId(newPointerIndex);
}
break;
}
}
return true;
}
mais je ne peux pas le faire. Je veux dire à chaque action de ma méthode est appelée. même lorsque les valeurs de x et y deux actionup et actiondown ne sont pas les mêmes. et je pense que j'ai aussi besoin de mettre un peu de la plage à la singletap que nous touchons avec nos doigts sur l'écran. Quelqu'un peut-il me suggérer quelques façons?
- Il ne sera jamais exactement à la même place - votre doigt va toujours se déplacer légèrement. Utiliser une gamme de check - assurez-vous que l'abs(upLoc-downLoc) < 5.
- - je besoin pour utiliser le contrôle de portée, mais je ne comprends pas votre"abs(upLoc-downLoc)<5".
- abs=valeur absolue. Cela signifie donc que si l'emplacement a changé en moins de 5 pixels.
Vous devez vous connecter pour publier un commentaire.
J'ai aussi couru dans le même problème récemment et a fini par avoir à mettre en œuvre un anti-rebond pour le faire fonctionner. Ce n'est pas idéal, mais c'est assez fiable jusqu'à ce que je peux trouver quelque chose de mieux.
Vue.onClickListener a été beaucoup plus fiable pour moi, mais malheureusement, j'ai besoin de la MotionEvent de la OnTouchListener.
Edit: suppression de l'excès de code qui serait la cause de l'échec ici
À détecter Unique et Double Tap android, et je suis en utilisant les méthodes suivantes :
L'utiliser dans le constructeur de GestureDetector :
Et ajoutez le code suivant dans onTouch auditeur
Detect Gesture
section.L'ajout de la réponse par souci d'exhaustivité et si quelqu'un d'autre trouve ici:
Vous pouvez utiliser un
GestureDetector
avec unOnTouchListener
Ajouter GestureDetector.SimpleOnGestureListener pour la vue et l'utilisation de la méthode onSingleTapConfirmed dans ce.
Cette méthode est invoquée que lorsque le système d'exploitation Android a confirmé la touche sur la particulier est seul robinet et pas double tap.
Vous pouvez google pour android exemples.
Il est beaucoup plus simple et simple.
Utilisation MotionEvent.ACTION_DOWN && MotionEvent.ACTION_UP et le calendrier de la différence entre les événements.
Le code complet peut être trouvé ici. https://stackoverflow.com/a/15799372/3659481
}
Pense que vous n'avez pas besoin d'utiliser "l'égalité" de l'opérateur. Au lieu d'utiliser environ de la valeur
Et dans ACTION_UP vérifier les valeurs X et Y entre de l'intervalle.