Autor: Chen Yang borde colgado y
Se originó a partir de un colega me preguntó: "¿cómo elegante doble clic en el oyente," este comportamiento?
De hecho, muchos eventos similares relacionados, podemos hacer referencia al código fuente del sistema, porque a veces completamente dentro del sistema la capacidad de tener algún problema, nos podría lograr una característica deseada.
El ejemplo anterior colega le preguntó:
Qué elegante doble clic en el oyente?
Creo que más o menos tenemos algunas implementaciones, sin embargo, el sistema nos ha provisto de GestureDetector
la clase, si usted está familiarizado con tal realización, el sistema será capaz de elegir para el mismo programa, la aprobación del código va a mejorar.
Así que hoy tenemos la oportunidad de aprender en:
GestureDetector
¿Qué tal gesto de apoyo se detecta?
Aquí es un pequeño análisis de contenido borde.
Creamos la instancia de clase, la necesidad de las interfaces OnGestureListener
(utilizado para controlar una variedad de gestos) e implementarlo como un parámetro pasado al constructor:
Explicar el calendario de cada método de devolución de llamada (muy fácil de entender):
-
onDown
: Prensa de dedo; -
onShowPress
: Después de que se presiona el dedo, no levantado dentro de los 100 milisegundos, no se mueve; -
onSingleTapUp
: Pulse el dedo no se mueve, y ascensor (puede ser identificado como hacer clic) dentro de 500 milisegundos; -
onScroll
: Arrastre el dedo; -
onLongPress
: Pulsación larga (pulse el dedo, no levantado a menos de 500 milisegundos, no se mueve); -
onFling
: Después de arrastrar el dedo rápidamente dejó ir (desplazamiento inercial);
Además OnGestureListener
, hay una OnDoubleTapListener
ve ser capaz de adivinar el nombre se utiliza para monitorear doble clic en el evento:
explicar:
-
onSingleTapConfirmed
: He confirmado que este es un evento de clic, quieren desencadenar doble clic debe seguir rápidamente dos veces la pantalla (es decir: después de mover un dedo, no esperó a que el dedo 300 milisegundos pulsa de nuevo); -
onDoubleTap
: Evento de disparo doble clic en (después de levantar el dedo se presiona de nuevo a menos de 300 ms (Nota: Se activa cuando se pulsa de nuevo, por lo que no se ha abordado antes del disparo)) -
onDoubleTapEvent
: Evento de disparo táctil con los dedos después de hacer doble clic, incluyendoACTION_DOWN
,,ACTION_MOVE
(Nota:ACTION_UP
Después de la activación pulsación larga, no continuará a recibir elACTION_MOVE
evento, ya que el proceso de presionar con los dedos, el proceso no requiere movimiento del movimiento de los dedos, que es directamente ignorarACTION_MOVE
el evento. también, el método de devolución de llamada después de esto, antes de desencadenar a largo evento de prensa, si se presiona el dedo nuevo, ya no se identifica como un doble clic, no continuará para volver a llamar a este método, que reemplazóonScroll
). Este enfoque con lo anterioronDoubleTap
diferencia método es que,onDoubleTap
en el caso de una devolución de llamada de doble clic sólo una vez, y este método puede devolver la llamada tiempos;
Bueno, tiene una comprensión preliminar después, echar un vistazo a es la forma de detectar estos eventos.
1, onDown
Código para esta clase raramente, a menos de 800 líneas (SDK28).
Primer vistazo onDown método es cuando la devolución de llamada (disponible a tan sólo el método de interfaz CTRL + Click
nombre del método correspondiente a la localización para localizar llamadas específico):
Super simple, escuchando los ACTION_DOWN
acontecimientos inmediatamente retiró.
2, onShowPress
A continuación, echar un vistazo a onShowPress
los métodos (usando sólo dicho método para localizar):
Será GestureHandler
recibir what
los SHOW_PRESS
servicios repetidos siguiente mensaje para ver donde el pelo de la noticia:
emmm, también en la recepción de ACTION_DOWN
la voluntad de mHandler
(es decir, GestureHandler
el envío de) un mensaje que especifica un tiempo, y esta vez es la presión de la más el tiempo de TAP_TIMEOUT
duración se puede ver TAP_TIMEOUT
el valor se basa en ViewConfiguration
un getTapTimeout
método de obtener, y la apertura de la un vistazo:
Es 100 (ms), es decir, cuando se presiona el dedo, el retardo si esta tarea no se cancela dentro de 100 milisegundos, entonces el onShowPress
método de devolución de llamada.
3, onSingleTapUp y OnScroll
OK, ahora echar un vistazo a onSingleTapUp
:
Se puede ver que es en ACTION_UP
el momento de la devolución de llamada, la devolución de llamada debe cumplir tres condiciones, a saber:
1.mIsDoubleTapping a falso (es decir, doble clic en el evento no se activa);
2.mInLongPress a falso (es decir, a largo prensa evento no se activa);
3.mAlwaysInTapRegion 为 verdadera;
mAlwaysInTapRegion
¿A qué hora es true
, ¿qué hora es false
que:
Hay tres lugares de asignación, a saber:
1. ACTION_POINTER_DOWN
Cuando (al presionar otra vez el dedo) es false
, es decir, si sólo se presiona el primer dedo, hay 100 milisegundos nueva presionar con los dedos, a continuación, cuando el ascensor no va a dedo en el gatillo onSingleTapUp
;
2. ACTION_DOWN
cuando (sólo la primera prensa de dedo) true
;
3. ACTION_MOVE
Cuando, mirada else if
en el interior que if
, se juzga distance
(en movimiento distancia del dedo) es mayor que slopSquare
(la distancia de disparo mínima desplazado), y si es así, lo hará la devolución de llamada onScroll
método, y el mAlwaysInTapRegion
conjunto false
, lo que indica que, si se presiona el dedo 100 en cuestión de segundos, empezó a arrastrar, a continuación, onSingleTapUp
el método no es de devolución de llamada;
También puede ver cuando mAlwaysInTapRegion
se establece false
después de la siguiente ACTION_MOVE
llega el momento, si no hay un disparador de doble clic (es decir, por encima mIsDoubleTapping为false
) y el movimiento horizontal o vertical de la distancia dedo no es 0, entonces, habría sido la devolución de llamada onScroll
método.
Pues bien, ahora onScroll
, también habló, gire onLongPress
hacia arriba.
4, onLongPress
Ahora onShowPress
es el mismo método por medio del Handler
mecanismo de sincronización para lograr mensaje, se recibe LONG_PRESS
después del mensaje, llama al dispatchLongPress
método, dispatchLongPress
el método será primera marca mInLongPress
comotrue
(Nota: Esto afectará cuando se trata de la parte superior de la onSingleTapUp
devolución de llamada, debido a onSingleTapUp
la condición de devolución de llamada es la necesidad mInLongPress
de false
(es decir, una pulsación larga no disparo))
Luego de devolución de llamada onLongPress
método.
Así que LONG_PRESS
el mensaje cuando enviarlo?
También en ACTION_DOWN
el tiempo:
Antes de enviar un mensaje, primero comprobar si el monitor está encendido eventos de prensa, así como la emisión de corrección de prensa y no llevó a cabo la tarea una vez que la cancelación.
momento dado se puede ver el tiempo de inactividad evento además getLongPressTimeout
el método Length devuelve el valor predeterminado es 500 (ms), es decir, cuando el dedo se presiona medio segundo, onLongPress
el método será llamado de nuevo, por supuesto, a condición de que esta tarea no ha sido cancelado.
Hay varias situaciones pueden causar sido larga canceladas por las tareas de devolución de llamada:
Dentro de 500 ms nueva dedo se presiona;
Dentro de 500 ms activan onScroll
, es decir, movimiento de los dedos sobre una distancia especificada;
Levante el dedo dentro de 500 ms;
Dentro de 500 ms recibido el ACTION_CANCEL
evento (que ACTION
generalmente se deriva del contenedor padre creación privada);
Echar un vistazo onFling
:
5, onFling
Por lo general, tratamos con desplazamiento inercial no hace ninguna diferencia, excepto que primero se determinará si la devolución de llamada antes de deslizar mayor velocidad que la velocidad mínima especificada, o no llevar a cabo material rodante.
Bueno, por fin nos fijamos en onSingleTapConfirmed
, onDoubleTap
, onDoubleTapEvent
respectivamente, es cómo tratar con:
onSingleTapConfirmed, onDoubleTap, onDoubleTapEvent
private class GestureHandler extends Handler {
......
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
......
case TAP:
if (mDoubleTapListener != null) {
if (!mStillDown) {
mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent);
} else {
mDeferConfirmSingleTap = true;
}
}
break;
......
}
}
}
public boolean onTouchEvent(MotionEvent ev) {
......
boolean handled = false;
switch (action & MotionEvent.ACTION_MASK) {
......
case MotionEvent.ACTION_DOWN:
......
if (isConsideredDoubleTap(mCurrentDownEvent, mPreviousUpEvent, ev)) {
mIsDoubleTapping = true;
handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent);
handled |= mDoubleTapListener.onDoubleTapEvent(ev);
} else {
mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT);
}
mStillDown = true;
......
break;
case MotionEvent.ACTION_MOVE:
if (mIsDoubleTapping) {
handled |= mDoubleTapListener.onDoubleTapEvent(ev);
}
......
break;
case MotionEvent.ACTION_UP:
mStillDown = false;
if (mIsDoubleTapping) {
handled |= mDoubleTapListener.onDoubleTapEvent(ev);
}
......
if (mIsDoubleTapping) {
......
} else if (mInLongPress) {
......
} else if (mAlwaysInTapRegion) {
handled = mListener.onSingleTapUp(ev);
if (mDeferConfirmSingleTap && mDoubleTapListener != null) {
mDoubleTapListener.onSingleTapConfirmed(ev);
}
}
......
break;
......
}
......
return handled;
}
Primer vistazo a la onSingleTapConfirmed
método, se ha llamado en dos lugares, a saber:
GestureHandler
Recibir el TAP
mensaje de
El procesamiento de ACTION_UP
eventos
Cuando el GestureHandler
recibido TAP
mensaje comprueba si el dedo se ha levantado ( !mStillDown
), si ya se ha levantado, sería llamado de inmediato, de otra manera la mDeferConfirmSingleTap
marca true
para indicar onSingleTapConfirmed
el método debe ACTION_UP
devolución de llamada, puede verse en el proceso ACTION_UP
, si el dedo no se mueve y no se pulse el disparador, se determinaría mDeferConfirmSingleTap
si true
, sí, sería devolución de llamada onSingleTapConfirmed
método.
A continuación, mira ACTION_DOWN
, se llama al isConsideredDoubleTap
método para determinar si el incidente fue identificado por un doble clic, y si no, será la de GestureHandler
enviar un mensaje de latencia (retardo de devolución de llamada de onSingleTapConfirmed
método)
Si es así, será la mIsDoubleTapping
marca true
, seguido de la devolución de llamada onDoubleTap
y onDoubleTapEvent
. Se puede observar en ACTION_MOVE
y ACTION_UP
también acuerdo mIsDoubleTapping
para determinar si se debe continuar la devolución de llamada onDoubleTapEvent
método.
Bueno, ahora mira, si se trata de la forma reconocida como un doble clic para ver isConsideredDoubleTap
el método:
En primer lugar, el juez mAlwaysInBiggerTapRegion
, si se trata false
, a continuación, los representantes de las otras acciones ( ACTION_MOVE
,) ACTION_CANCEL
interrumpió detectar eventos de doble clic, se devuelve directamente false
(es decir, no se identifica con un doble clic) a.
Entonces determina la primera y segunda prensa pressing intervalo de tiempo, se afirma si más de 300 milisegundos se mide el tiempo hacia fuera, si menos de 40 ms serán ignorados (demasiado rápido).
Por último, muchos estudiantes pueden, a primera vista, no ver qué tipo de lógica, una mirada cercana a un par de veces, usted sabrá que esto es en realidad la primera vez en la prensa de computación y mantenga pulsada la distancia segunda coordenada, se calcula utilizando dos la distancia entre el punto de fórmula (√ (x1 - x2) ² + (y1 - y2) ²).
En este punto, algunos estudiantes podrían preguntarse:
Ni siquiera plaza abierta que? Es la forma en que el código no es?
De hecho, de que slopSquare
(esto es, haga doble clic puede ser identificado como el intervalo máximo) durante la inicialización, se ha cuadrando, así que no hay necesidad de abrir la plaza.
emmm, entonces el isConsideredDoubleTap
método últimos frase significa que, si las coordenadas del evento toque dos veces en un intervalo especificado es el rango de intervalo máximo, y si es así, es que es el doble clic.
Por último, adjuntar mi tecnología de la base Android programa de aprendizaje, acceso a contenidos relevantes para jugar con mi GitHub: https://github.com/Meng997998/AndroidJX
Se toma su tiempo para invertir en el aprendizaje, significa que usted puede ganar habilidades, tener la oportunidad de aumentar los ingresos.
Aquí para compartir mi Android PDF Daquan aprender a aprender, aprender este androide PDF Daquan realmente contiene todos los aspectos, y contiene conocimientos básicos de Java, la base de Android, Android extensión avanzada, y así sucesivamente algoritmo de recolección
contenido relacionado con el aprendizaje Android: preocupación veo introducción personal , o directamente carta privada que
Mi colección de este estudio, puede ayudar eficazmente a captar los puntos de conocimiento.
En resumen también estamos aquí para ayudar a mejorar el aprendizaje avanzado, pero también le ahorra el tiempo para aprender los datos de búsqueda en línea también se pueden compartir con amigos cercanos estudiar juntos