Historia de la se "copia" de los programadores! Esto protege habilidades, bien en el código fuente del sistema para sus propios fines!

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 GestureDetectorla 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 OnDoubleTapListenerve 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, incluyendo ACTION_DOWN,, ACTION_MOVE(Nota:ACTION_UP Después de la activación pulsación larga, no continuará a recibir el ACTION_MOVEevento, ya que el proceso de presionar con los dedos, el proceso no requiere movimiento del movimiento de los dedos, que es directamente ignorar ACTION_MOVEel 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 anterior onDoubleTapdiferencia método es que, onDoubleTapen 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 + Clicknombre del método correspondiente a la localización para localizar llamadas específico):

Super simple, escuchando los ACTION_DOWNacontecimientos inmediatamente retiró.

2, onShowPress

A continuación, echar un vistazo a onShowPresslos métodos (usando sólo dicho método para localizar):

Será GestureHandlerrecibir whatlos SHOW_PRESSservicios repetidos siguiente mensaje para ver donde el pelo de la noticia:

emmm, también en la recepción de ACTION_DOWNla voluntad de mHandler(es decir, GestureHandlerel envío de) un mensaje que especifica un tiempo, y esta vez es la presión de la más el tiempo de TAP_TIMEOUTduración se puede ver TAP_TIMEOUTel valor se basa en ViewConfigurationun getTapTimeoutmé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 onShowPressmétodo de devolución de llamada.

3, onSingleTapUp y OnScroll

OK, ahora echar un vistazo a onSingleTapUp:

Se puede ver que es en ACTION_UPel 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 falseque:

Hay tres lugares de asignación, a saber:

1. ACTION_POINTER_DOWNCuando (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_DOWNcuando (sólo la primera prensa de dedo) true;

3. ACTION_MOVECuando, mirada else ifen 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 onScrollmétodo, y el mAlwaysInTapRegionconjunto false, lo que indica que, si se presiona el dedo 100 en cuestión de segundos, empezó a arrastrar, a continuación, onSingleTapUpel método no es de devolución de llamada;

También puede ver cuando mAlwaysInTapRegionse establece falsedespués de la siguiente ACTION_MOVEllega 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 onScrollmétodo.

Pues bien, ahora onScroll, también habló, gire onLongPresshacia arriba.

4, onLongPress

Ahora onShowPresses el mismo método por medio del Handlermecanismo de sincronización para lograr mensaje, se recibe LONG_PRESSdespués del mensaje, llama al dispatchLongPressmétodo, dispatchLongPressel método será primera marca mInLongPresscomotrue

(Nota: Esto afectará cuando se trata de la parte superior de la onSingleTapUpdevolución de llamada, debido a onSingleTapUpla condición de devolución de llamada es la necesidad mInLongPressde false(es decir, una pulsación larga no disparo))

Luego de devolución de llamada onLongPressmétodo.

Así que LONG_PRESSel mensaje cuando enviarlo?

También en ACTION_DOWNel 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 getLongPressTimeoutel método Length devuelve el valor predeterminado es 500 (ms), es decir, cuando el dedo se presiona medio segundo, onLongPressel 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_CANCELevento (que ACTIONgeneralmente 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, onDoubleTapEventrespectivamente, 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 onSingleTapConfirmedmétodo, se ha llamado en dos lugares, a saber:

GestureHandlerRecibir el TAPmensaje de

El procesamiento de ACTION_UPeventos

Cuando el GestureHandlerrecibido TAPmensaje comprueba si el dedo se ha levantado ( !mStillDown), si ya se ha levantado, sería llamado de inmediato, de otra manera la mDeferConfirmSingleTapmarca truepara indicar onSingleTapConfirmedel método debe ACTION_UPdevolució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 mDeferConfirmSingleTapsi true, sí, sería devolución de llamada onSingleTapConfirmedmétodo.

A continuación, mira ACTION_DOWN, se llama al isConsideredDoubleTapmétodo para determinar si el incidente fue identificado por un doble clic, y si no, será la de GestureHandlerenviar un mensaje de latencia (retardo de devolución de llamada de onSingleTapConfirmedmétodo)

Si es así, será la mIsDoubleTappingmarca true, seguido de la devolución de llamada onDoubleTapy onDoubleTapEvent. Se puede observar en ACTION_MOVEy ACTION_UPtambién acuerdo mIsDoubleTappingpara determinar si se debe continuar la devolución de llamada onDoubleTapEventmétodo.

Bueno, ahora mira, si se trata de la forma reconocida como un doble clic para ver isConsideredDoubleTapel método:

En primer lugar, el juez mAlwaysInBiggerTapRegion, si se trata false, a continuación, los representantes de las otras acciones ( ACTION_MOVE,) ACTION_CANCELinterrumpió 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 isConsideredDoubleTapmé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

Publicados 168 artículos originales · ganado elogios 71 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/Aerfa789/article/details/105203310
Recomendado
Clasificación