Cómo combinar OnClickListener y OnTouchListener para un ImageButton

Tengo que hacer algo cuando el usuario hace clic en el ImageButton he intentado crear una clase estática que implementa OnClickListener y OnTouchListener

 static class ClickListenerForScrolling implements OnClickListener, OnTouchListener 

Que tiene los siguientes métodos:

 @Override public void onClick(View v) 

y

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

La idea detrás de esto es cambiar el origen de imagen del ImageButton cuando el usuario lo toca, y realizar una tarea cuando el usuario hace clic en este botón. ¿Puede alguien darme una pista sobre cómo hacer esto?

Dado que ambas acciones consisten en los gestos "poner el dedo en la pantalla – levantar el dedo de la pantalla" no se puede determinar si se trata de una acción táctil o de un clic. Por lo tanto, si implementa a ambos oyentes en este botón de imagen, un toque / clic cambiará la imagen y presionará el botón. No estoy seguro si hay un orden determinado de estos eventos …

Sin embargo, si desea separar estos eventos, deberá definir un gesto distinto a una de las acciones (como borrar para cambiar la imagen), o crear diferentes áreas que manejan los eventos, por ejemplo, la imagen no encaja El botón completo y el área libre sirven como área de clic de botón.

HTH

Actualizar:

Me di cuenta, que un TouchEvent es más general que un ClickEvent lo que se llama primero.

 public abstract boolean onTouch (View v, MotionEvent event) 

Esto devuelve true si el oyente ha consumido el evento, false en caso contrario. Así que usted puede decidir en su implementación si el evento también debe ser manejado por OnClickListener, a continuación, simplemente devolver false .

El onTouchListener es capaz de manejar ambos movimientos.

Switch entre los valores event.action() para obtener MotionEvent .

case MotionEvent.ACTION_DOWN : es el impacto del primer dedo.
case MotionEvent.ACTION_UP : es cuando el dedo se va.

Deberá establecer el punto de impacto en ACTION_DOWN .

TheImpactPoint=event.getX();

Y luego obtenga la distancia con ACTION_UP

float distance =TheImpactPoint-event.getX();

If distance = 0 entonces hay un clic, de lo contrario sería más o menos de cero dependiendo del gesto.

Así que esta es la forma de utilizar el evento de clic sin un evento de clic real y usar sólo el onTouchListener .

La esperanza será útil.

Utilice este código:

 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; } } } 

Extiende esta clase y usa como esta …

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

Utilice return false en lugar de return true

  • Obtener coordenadas reales de xy de los usuarios
  • No puede manejar simultáneamente los eventos de clic y de toque
  • ¿Cómo puedo pasar Touch Listeners a la vista personalizada para arrastrar y soltar?
  • Cómo agregar la funcionalidad de deslizar en Android CardView?
  • Android deja de enviar eventos onTouch
  • Combinación de combinación de Android :: OnTouchListener && OnClickListener
  • Android: ImageView getID (); Devolver entero
  • Hacer diferencias entre setOnClickListener y setOnTouchListener
  • Implementación de la interfaz View.IOnTouchListener
  • Android: ¿Qué uso tiene AnchorView de MediaController?
  • SwipeListView sólo un elemento abierto a la vez
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.