proceso de entrega de eventos "Android"

1. ¿Cuál es la entrega del evento?
entrega de eventos Android se refiere a una serie de acciones de sucesos de operación de usuario de pantalla generada (presión, deslizamiento, elevación) el proceso se transfiere desde el exterior a la capa interior.

2, la forma de entender el exterior a la capa interior?
Actividad -> Ventana ----> ViewGroup ---- > Ver

3, debe entender el básico
3.1 Hay que saber en primer lugar el objeto pasado es una clase de objeto MotionEvent. Esta clase define una operación constante, como "pulse" estática pública final int ACTION_DOWN = 0 y similares.
3,2 segundos a conocer tres aspectos importantes:
evento de distribución dispatchTouchEvent booleano (MotionEvent EV) EV
booleano onInterceptTouchEvent (MotionEvent ev) está bloqueando el evento ev
booleano onTouchEvent (MotionEvent ev) si el evento ev consumen
alrededor de 3,3 con regularidad para ver la escucha conjunto de eventos métodos
view.setOnTouchListener (...) de eventos táctiles oyente
view.setOnClickListener (...) los oyentes de evento de clic

4, el proceso específico de entrega de sucesos de
4.1 genera eventos:
la pantalla táctil con los dedos para producir un primer evento MotionEvent hacia abajo, como el dedo deslizante más productos MotionEvent Mover caso, finalmente se levantó el dedo para producir un eventos MotionEvent Up
4.2 evento en la Actividad:
La actividad en hay dispatchTouchEvent (), () 2 onTouchEvent métodos.

 /**
     * Called to process touch screen events.  You can override this to
     * intercept all touch screen events before they are dispatched to the
     * window.  Be sure to call this implementation for touch screen events
     * that should be handled normally.
     *
     * @param ev The touch screen event.
     *
     * @return boolean Return true if this event was consumed.
     */
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();
        }
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }
     /**
     * Called when a touch screen event was not handled by any of the views
     * under it.  This is most useful to process touch events that happen
     * outside of your window bounds, where there is no view to receive it.
     *
     * @param event The touch screen event being processed.
     *
     * @return Return true if you have consumed the event, false if you haven't.
     * The default implementation always returns false.
     */
    public boolean onTouchEvent(MotionEvent event) {
        if (mWindow.shouldCloseOnTouch(this, event)) {
            finish();
            return true;
        }

        return false;
    }

dispatchTouchEvent caso go pasó GetWindow (). superDispatchTouchEvent (EV) juzgo, si la devolución es cierto, al final directa. Actividad onTouchEvent si el disparador es falso método ().
Que la actividad en (). SuperDispatchTouchEvent método (ev) pasa el evento a la ventana por GetWindow.
4.3 En el caso de la ventana:
. GetWindow () superDispatchTouchEvent (EV) llamada superDispatchTouchEvent dentro del método de la ventana ().

 /**
     * Used by custom windows, such as Dialog, to pass the touch screen event
     * further down the view hierarchy. Application developers should
     * not need to implement or call this.
     *
     */
    public abstract boolean superDispatchTouchEvent(MotionEvent event);

Este es un método abstracto. La lógica específico únicamente en la ventana PhoneWidow clase derivada:

 @Override
    public boolean superDispatchTouchEvent(MotionEvent event) {
        return mDecor.superDispatchTouchEvent(event);
    }

El evento no hizo la tarea en la ventana en el proceso, que pasa directamente a través de mDecor.superDispatchTouchEvent (evento) a la DecorView. DecorView es la vista superior de un objeto se define en la PhoneWindow. Es una clase que hereda de FrameLayout de ViewGroup.

// This is the top-level view of the window, containing the window decor.
    private DecorView mDecor;

4.4 En el ViewGroup evento en:
eventos a DecorView de superDispatchTouchEvent () método

public boolean superDispatchTouchEvent(MotionEvent event) {
        return super.dispatchTouchEvent(event);
    }

Llamada super.dispatchTouchEvent (evento), esta super es en realidad ViewGroup.
Hay dispatchTouchEvent (), onInterceptTouchEvent (), onTouchEvent () 3 de métodos en el ViewGroup.
A medida que la fuente es demasiado largo, que también contiene una gran cantidad de unidad de control, con el fin de analizar el proceso de pegatinas a cabo directamente no es intuitivo, no quiero excesiva duración de los suyos para ver más impresionante! Resumir directa:
(1) evento MotionEvent aprobó para su distribución evento para dispatchTouchEvent (EV)
(2) dentro de las llamadas a métodos de distribución si onInterceptTouchEvent interpretación (EV) de la intercepción de eventos (devuelto por falso no interceptar, cierto defecto de representación de interceptación es falso.) .
(3) onInterceptTouchEvent (EV) devuelve verdadero, explican a los eventos de intercepción, EV será remitida a este proceso ViewGroup.
(4) Si ViewGroup establece OnTouchListener, onTouch () se llama, se llamará onTouch () devuelve FALSE ViewGroup de onTouchEvent. OnTouch () Devuelve verdadero ViewGroup de onTouchEvent será bloqueado.
(5) onInterceptTouchEvent (EV) devuelve falso, no bloquea el evento, se pasa el caso a la sub-View (Vista o ViewGroup) del proceso de dispatchTouchEvent (EV). Si el niño es vista ViewGroup continuar a partir de (1) para iniciar el ciclo.

4.4 En el caso de Vista:
No dispatchTouchEvent (), onTouchEvent () 2 métodos en la vista. Sin onInterceptTouchEvent ()
es similar al proceso de ViewGroup, después de todo ViewGroup heredado de Vista. ViewGroup no reescribir onTouchEvent, por lo ViewGroup en onTouchEvent () método es la vista del método.
(1) Evento MotionEvent pasa a dispatchTouchEvent (ev) para la distribución de evento
(2) Si la vista se establece OnTouchListener, onTouch () es llamado, onTouch () devuelve falso vista de onTouchEvent será llamado. OnTouch () Devuelve verdadero vista de onTouchEvent será bloqueado.

5, setOnTouchListener () \ setOnClickListener ( ) \ onTouchEvent () llama a la relación:
La siguiente es una vista de dispatchTouchEvent () Fuente

/**
     * Pass the touch screen motion event down to the target view, or this
     * view if it is the target.
     *
     * @param event The motion event to be dispatched.
     * @return True if the event was handled by the view, false otherwise.
     */
    public boolean dispatchTouchEvent(MotionEvent event) {
        // If the event should be handled by accessibility focus first.
        if (event.isTargetAccessibilityFocus()) {
            // We don't have focus or no virtual descendant has it, do not handle the event.
            if (!isAccessibilityFocusedViewOrHost()) {
                return false;
            }
            // We have focus and got the event, then use normal event dispatch.
            event.setTargetAccessibilityFocus(false);
        }

        boolean result = false;

        if (mInputEventConsistencyVerifier != null) {
            mInputEventConsistencyVerifier.onTouchEvent(event, 0);
        }

        final int actionMasked = event.getActionMasked();
        if (actionMasked == MotionEvent.ACTION_DOWN) {
            // Defensive cleanup for new gesture
            stopNestedScroll();
        }

        if (onFilterTouchEventForSecurity(event)) {
            if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
                result = true;
            }
            //noinspection SimplifiableIfStatement
            ListenerInfo li = mListenerInfo;
            if (li != null && li.mOnTouchListener != null
                    && (mViewFlags & ENABLED_MASK) == ENABLED
                    && li.mOnTouchListener.onTouch(this, event)) {
                result = true;
            }

            if (!result && onTouchEvent(event)) {
                result = true;
            }
        }

        if (!result && mInputEventConsistencyVerifier != null) {
            mInputEventConsistencyVerifier.onUnhandledEvent(event, 0);
        }

        // Clean up after nested scrolls if this is the end of a gesture;
        // also cancel it if we tried an ACTION_DOWN but we didn't want the rest
        // of the gesture.
        if (actionMasked == MotionEvent.ACTION_UP ||
                actionMasked == MotionEvent.ACTION_CANCEL ||
                (actionMasked == MotionEvent.ACTION_DOWN && !result)) {
            stopNestedScroll();
        }

        return result;
    }

En el que determinar la mOnTouchListener! = NULL && mOnTouchListener.onTouch (esto , evento) condición, entonces devuelve los resultados de acuerdo con la determinación, si invoca onTouchEvent (evento). Verified OnTouchListener llamadas de prioridad, y la llamada de control onTouchEvent ().
En vista de onTouchEvent () método

 public boolean onTouchEvent(MotionEvent event) {
        ...代码省略...
        if (clickable || (viewFlags & TOOLTIP) == TOOLTIP) {
            switch (action) {
                case MotionEvent.ACTION_UP:
                    ...代码省略...
                            if (!focusTaken) {
                                if (mPerformClick == null) {
                                    mPerformClick = new PerformClick();
                                }
                                if (!post(mPerformClick)) {
                                    performClickInternal();
                                }
                            }
                            ...代码省略...
                        }
         ...代码省略...

performClickInternal () método se transferirá performClick (), publicada PerformClick () Código

public boolean performClick() {
        // We still need to call this method to handle the cases where performClick() was called
        // externally, instead of through performClickInternal()
        notifyAutofillManagerOnClick();

        final boolean result;
        final ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            li.mOnClickListener.onClick(this);
            result = true;
        } else {
            result = false;
        }

        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);

        notifyEnterOrExitForAutoFillIfNeeded(true);

        return result;
    }

li.mOnClickListener.onClick aquí desencadenado (este). Descripción onClick evento click se llama indirectamente en onTouchEvent en.

6, el caso al procesamiento de la capa superior
sub-punto de vista no puede manejar eventos cuando, onTouchEvent devuelve falso, se le dará el evento para onTouchEvent llame a la vista padre. Si no puede controlar el evento a su vez dejado pasar. Hasta actividad. Es decir, GetWindow (). SuperDispatchTouchEvent (EV) devuelve falso. Actividad se llama el método onTouchEvent ().

Publicado seis artículos originales · elogios ganado 14 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/u010823943/article/details/105176685
Recomendado
Clasificación