Análisis del código fuente del proceso de redibujo iniciado por el requestLayout de View (Android Q)

Análisis del código fuente del proceso de redibujo iniciado por el requestLayout de View (Android Q)


Por lo general, llamamos al método requestLayout de la clase View para actualizar la vista, entonces, ¿cómo inicia la lógica de redibujo?

Ver el método requestLayout:

    public void requestLayout() {
        ……
        if (mParent != null && !mParent.isLayoutRequested()) {
            //调用父视图的 requestLayout 方法
            mParent.requestLayout();
        }
        ……
    }

Este método establece algunas propiedades y luego llama al método requestLayout de la vista principal. Este método siempre se llamará en el árbol de vistas, hasta la vista raíz, que es DecorView. Pero al final, ¿se llama al método requestLayout de DecorView?

Veamos primero dónde está asignado mParent.

Ver el método assignParent

    protected ViewParent mParent;
    void assignParent(ViewParent parent) {
        if (mParent == null) {
            mParent = parent;
        } else if (parent == null) {
            mParent = null;
        } else {
            throw new RuntimeException("view " + this + " being added, but"
                    + " it already has a parent");
        }
    }

mParent se establece a través de los parámetros de assignParent, y ¿quién llamó al método assignParent?

El método setView de ViewRootImpl:

Regresemos, el método setView de ViewRootImpl se llama cuando DecorView se va a agregar a la ventana.

    public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView){
        ……
        view.assignParent(this);
        ……
    }

De hecho, en el método setView de ViewRootImpl, se llama al método assignParent de View y el parámetro es el objeto ViewRootImpl. En otras palabras, mParent de DecorView es un objeto ViewRootImpl.

Por lo tanto, el método requestLayout de View finalmente pasó por su mParent, y finalmente llamó al método requestLayout en ViewRootImpl. ¿No está esto relacionado con el contenido de la primera mitad de este artículo? Ambos procesos de visualización de vistas se inician mediante el método requestLayout en ViewRootImpl.

para resumir


El método requestLayout de la clase View actualiza la vista. ¿Cómo inicia la lógica de redibujo?

  1. En el método setView de ViewRootImpl, se llama al método assignParent de View y el parámetro es el objeto ViewRootImpl. En otras palabras, mParent de DecorView es un objeto ViewRootImpl.

  2. El método requestLayout de View finalmente burbujeó a través de su mParent, y finalmente llamó al método requestLayout en ViewRootImpl. Entonces, esencialmente, se inicia a través del método requestLayout en ViewRootImpl.


PD: Para obtener más artículos de análisis, consulte la serie de artículos -> "Análisis de los principios subyacentes de Android"
PD: Para obtener más artículos de análisis, consulte la serie de artículos -> "Análisis de los principios subyacentes de Android"
PD: Para obtener más artículos de análisis, consulte la serie-> "Análisis de los principios subyacentes de Android"

Supongo que te gusta

Origin blog.csdn.net/u011578734/article/details/110958596
Recomendado
Clasificación