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:
- Analog SetOnTouchListener o cómo se utiliza en xamarin, qué argumento debe ser
- Android: OnTouch, MotionEvent.ACTION_MOVE no está reconocido?
- Cómo implementar tanto ontouch y también onfling en un mismo listview?
- OnTouch dando extraños puntos de contacto Android
- Pase Android NestedScrollView desplazamientos horizontales a un padre Ver
@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?
- ¿Cómo puedo mantener los eventos de ontouch manejados por un widget incluso si las coordenadas de tacto ya no están dentro del widget, en android
- Android: ImageView getID (); Devolver entero
- Usando OnTouchListener y OnLongClickListener interfiere entre sí
- Limitación de Drag de ImageView en Android
- Implementación de la interfaz View.IOnTouchListener
- android arrastrar y soltar ImageView onTouchListener
- OnTouchListener de una vista vs onTouchEvent
- EditText en ListView pierde foco cuando se presiona en Android 4.x
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