Implementación de escuchas de OnTap
¿Tengo una duda que está en el oyente del golpecito implementado en un botón particular, o una visión de la imagen o una visión? porque los sitios que he navegado sólo muestra para todo el diseño y quiero que mi acción se realice en el toque de una vista. por favor ayuda. Gracias.
- Android establece scrollLeft al actualizar contenido en el evento de desplazamiento no actualiza la posición de la barra de desplazamiento
- Android: Cerrar ventana de diálogo al tocar
- Android: El botón de superposición onClick nunca se llama
- Rotar imagen junto con toque para fijar punto en android
- ¿Cómo deshabilitar el umbral de movimiento al obtener eventos táctiles?
- Obtener la posición de toque al arrastrar
- ¿Cómo detectar cuando un actor es tocado en libgdx?
- ¿Cómo puedo detectar la entrada táctil en Android?
- Android: ¿Dos eventos diferentes para un solo toque y una larga pulsación / doble pulsación?
Cualquier vista se puede configurar con un onClickListener()
que forma parte de la clase view. La forma más sencilla de hacerlo es configurar las referencias a su vista en el método onCreate()
. A continuación se muestra un ejemplo para una vista de imagen:
ImageView iv = (ImageView) findViewByID(R.id.example); iv.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Do what you need to do on click .... } });
ACTUALIZACIÓN: DOBLE TAP
A continuación se muestra una actividad de ejemplo que implementa la detección básica de doble toque en una vista de imagen:
import android.app.Activity; import android.os.Bundle; import android.os.SystemClock; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.Toast; public class DoubleTapActivity extends Activity { //Set the double tap delay in milliseconds protected static final long DOUBLE_CLICK_MAX_DELAY = 1000L; private ImageView iView; private long thisTime = 0; private long prevTime = 0; private boolean firstTap = true; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); iView = (ImageView)findViewById(R.id.iView); iView.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub if(firstTap){ thisTime = SystemClock.uptimeMillis(); firstTap = false; } else { prevTime = thisTime; thisTime = SystemClock.uptimeMillis(); //Check that thisTime is greater than prevTime //just incase system clock reset to zero if(thisTime > prevTime){ //Check if times are within our max delay if((thisTime - prevTime) <= DOUBLE_CLICK_MAX_DELAY){ //We have detected a double tap! Toast.makeText(DoubleTapActivity.this, "DOUBLE TAP DETECTED!!!", Toast.LENGTH_LONG).show(); //PUT YOUR LOGIC HERE!!!! } else { //Otherwise Reset firstTap firstTap = true; } } else { firstTap = true; } } return false; } }); } }
Principalmente para detectar el evento de toque que tiene que implementar GestureDetector.OnGestureListener
en su actividad. Puede realizar una acción utilizando el onSingleTapUp(MotionEvent e)
de GestureDetector.OnGestureListener
.
Generalmente para el control Button, usamos como
myButton.setOnClickListener(new OnClickListener() {});
u otros clickListners y tap eventos se utilizan para ImageView o cualquier otra vista previa.
@Override public boolean onTouchEvent (evento MotionEvent) {
// on action down do your work... return super.onTouchEvent(event); }
Añadir android:onClick="tapEvent"
en su diseño que desea tomar el clic. Al cambiar el valor MAX_TAP_COUNT
, puede utilizar cualquier número de taps.
private long thisTime = 0; private long prevTime = 0; private int tapCount = 0; private static final int MAX_TAP_COUNT = 5; protected static final long DOUBLE_CLICK_MAX_DELAY = 500; public void tapEvent(View v){ if (SystemClock.uptimeMillis() > thisTime) { if ((SystemClock.uptimeMillis() - thisTime) > DOUBLE_CLICK_MAX_DELAY * MAX_TAP_COUNT) { Log.d(TAG, "touch event " + "resetting tapCount = 0"); tapCount = 0; } if (tapCount()) { //DO YOUR LOGIC HERE } } } private Boolean tapCount(){ if (tapCount == 0) { thisTime = SystemClock.uptimeMillis(); tapCount++; } else if (tapCount < (MAX_TAP_COUNT-1)) { tapCount++; } else { prevTime = thisTime; thisTime = SystemClock.uptimeMillis(); //just incase system clock reset to zero if (thisTime > prevTime) { //Check if times are within our max delay if ((thisTime - prevTime) <= DOUBLE_CLICK_MAX_DELAY * MAX_TAP_COUNT) { //We have detected a multiple continuous tap! //Once receive multiple tap, reset tap count to zero for consider next tap as new start tapCount = 0; return true; } else { //Otherwise Reset tapCount tapCount = 0; } } else { tapCount = 0; } } return false; }