74 votes

L'événement Ontouch d'OnTouchListener est appelé deux fois dans Android

Je crée une appliction dans laquelle une ligne est générée entre deux points donnés lors de l'exécution.
Le problème que je vois est que onTouch() est appelé deux fois pour chaque clic sur mon simulateur. Je sais que deux actions ( ACTION_DOWN & ACTION_UP ) sont vérifiées. Mais je veux que mon application appelle onTouch() une seule fois. Veuillez me donner quelques idées. Voici le code que j'ai utilisé:

 SurfaceView surfaceview = new SurfaceView(getContext());
SurfaceHolder h = surfaceview.getHolder();
int action = event.getActionMasked();
synchronized(h) {
    if (action == MotionEvent.ACTION_DOWN && action!=MotionEvent.ACTION_CANCEL)// && flag==true)
    {
        Log.d("TouchView","ACTION_DOWN ");
        Point pointer = new Point();
        pointer.x = (int) event.getX();
        pointer.y = (int) event.getY();
        touchPoint.add(pointer);
        view.invalidate();
        Log.d("MotionEvent.ACTION_DOWN", "point: " + pointer);
        action = MotionEvent.ACTION_CANCEL;
        flag = false;
    }
    else if(action == MotionEvent.ACTION_UP && action!=MotionEvent.ACTION_CANCEL)// && flag==true)
    {
        Log.d("TouchView","ACTION_UP");
        Point pointer = new Point();
        pointer.x = (int) event.getX();
        pointer.y = (int) event.getY();
        touchPoint.add(pointer);
        view.invalidate();
        Log.d("MotionEvent.ACTION_UP", "point: " + pointer);
        action = MotionEvent.ACTION_CANCEL;
        flag = false;
    }
    else return false;
}
 

178voto

touchListener sera appelé pour chaque MotionEvent.ACTION_DOWN , MotionEvent.ACTION_UP et MotionEvent.ACTION_MOVE . donc si vous voulez exécuter du code une seule fois, c'est-à-dire MotionEvent.ACTION_DOWN puis à l'intérieur

 onTouch()
 if (action == MotionEvent.ACTION_DOWN)
{
//your code 
}
 

4voto

Dpedrinha Points 178

Ou utilisez simplement onClickListener:

         myButton.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                //do what you gotta do
            }
        });
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X