Question Comment combiner OnClickListener et OnTouchListener pour un ImageButton


Je dois faire quelque chose lorsque l'utilisateur clique sur le bouton ImageButton J'ai essayé de créer une classe statique qui implémente tous les deux  OnClickListener et OnTouchListener

static class ClickListenerForScrolling implements OnClickListener, OnTouchListener 

qui a les méthodes suivantes:

@Override
public void onClick(View v)

et

@Override
public boolean onTouch(View arg0, MotionEvent arg1)

L’idée derrière tout cela est de changer la source de l’image du ImageButton lorsque l'utilisateur le touche et exécute une tâche lorsque l'utilisateur clique sur ce bouton. Quelqu'un peut-il me donner un indice sur la façon de procéder?


22
2017-07-20 11:46


origine


Réponses:


Puisque les deux actions consistent en des gestes "mettre le doigt sur l'écran - soulever le doigt de l'écran", vous ne pouvez pas déterminer s'il s'agissait d'une action tactile ou d'un clic. Donc, si vous implémentez les deux écouteurs sur ce bouton d'image, un toucher / clic changera l'image ET appuyez sur le bouton. Pas sûr s'il y a un ordre déterminé de ces événements ...

Cependant, si vous souhaitez séparer ces événements, vous devrez soit définir un geste différent pour l'une des actions (comme effacer pour changer d'image), soit créer différentes zones qui gèrent les événements, par exemple l'image ne correspond pas. le bouton entier et la zone libre servent de zone de clic de bouton.

HTH

Mettre à jour:

J'ai compris que TouchEvent est plus général qu'un ClickEvent c'est ainsi qu'on l'appelle en premier.

public abstract boolean onTouch (View v, MotionEvent event)

Cela retourne true si l'auditeur a consommé l'événement, sinon false. Vous pouvez donc décider dans votre implémentation si l’événement doit également être géré par OnClickListener, puis retournez simplement false.


33
2017-07-20 12:12



le onTouchListener est capable de gérer les deux mouvements.

Switch entre event.action() valeurs à obtenir MotionEvent.

case MotionEvent.ACTION_DOWN: est l'impact du premier doigt.
case MotionEvent.ACTION_UP: c'est quand le doigt s'en va.

Vous devrez définir le point d'impact sur ACTION_DOWN.

TheImpactPoint=event.getX();

Et puis obtenir la distance avec ACTION_UP

float distance =TheImpactPoint-event.getX();

If distance = 0 alors il y a un clic, sinon ce serait plus ou moins que zéro selon le geste.

Donc, c'est la façon d'utiliser l'événement click sans un événement de clic réel et en utilisant uniquement le onTouchListener.

L'espoir sera utile.


11
2018-03-05 22:14



Utilisez ce code:

public class GestureHelper implements OnTouchListener {

private final GestureDetector mGestureDetector;

public GestureHelper(Context context) {
    mGestureDetector = new GestureDetector(context, new GestureListener(this));
}

public void onSwipeRight() {
};

public void onSwipeLeft() {
};

public void onSwipeTop() {
};

public void onSwipeBottom() {
};

public void onDoubleTap() {
};

public void onClick() {
};

@Override
public boolean onTouch(View v, MotionEvent event) {
    return mGestureDetector.onTouchEvent(event);
}

private static final class GestureListener extends SimpleOnGestureListener {

    private static final int SWIPE_THRESHOLD = 100;
    private static final int SWIPE_VELOCITY_THRESHOLD = 100;
    private GestureHelper mHelper;

    public GestureListener(GestureHelper helper) {
        mHelper = helper;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        mHelper.onClick();
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        mHelper.onDoubleTap();
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        boolean result = false;
        try {
            float diffY = e2.getY() - e1.getY();
            float diffX = e2.getX() - e1.getX();
            if (Math.abs(diffX) > Math.abs(diffY)) {
                if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffX > 0) {
                        mHelper.onSwipeRight();
                    } else {
                        mHelper.onSwipeLeft();
                    }
                }
            } else {
                if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        mHelper.onSwipeBottom();
                    } else {
                        mHelper.onSwipeTop();
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return result;
    }
}

}

Prolongez cette classe et utilisez-la comme ça ...

view.setOnTouchListener(new SomeYourGestureHelper(context, someParameters));

10
2018-05-26 10:29



Utilisation return false au lieu de return true


3
2017-07-13 09:03