Mecanismo de distribución de eventos View de Android (1)

Antes de comprender el mecanismo de distribución de eventos de View, debe comprender la composición de Activity y luego analizar el mecanismo de distribución de eventos de View desde la perspectiva del código fuente.

1. Análisis del código fuente Composición de la actividad

Señale el evento con MotionEvent para representar. Cuando se genera un evento de clic, el evento se pasa primero a la Actividad, por lo que primero debemos comprender la composición de la Actividad. Cuando escribimos Actividad, llamaremos al método setContentView para cargar el diseño. Primero veamos el método setContentView:

@Override
    public void setContentView(@LayoutRes int layoutResID) {
       getWindow().setContentView(layoutResID)
       initWindowDecorActionBar();
    }

¿Qué obtendrá getWindow() aquí? Luego mira hacia abajo. getWindow() devuelve mWindow:


    /**
     * Retrieve the current {@link android.view.Window} for the activity.
     * This can be used to directly access parts of the Window API that
     * are not available through Activity/Screen.
     *
     * @return Window The current window, or null if the activity is not
     *         visual.
     */
    public Window getWindow() {
        return mWindow;
    }

La mWindow aquí es la ventana actual. Veamos cómo se obtiene mWindow:

final void attach(Context context, ActivityThread aThread,
            Instrumentation instr, IBinder token, int ident,
            Application application, Intent intent, ActivityInfo info,
            CharSequence title, Activity parent, String id,
            NonConfigurationInstances lastNonConfigurationInstances,
            Configuration config, String referrer, IVoiceInteractor voiceInteractor,
            Window window, ActivityConfigCallback activityConfigCallback, IBinder assistToken,
            IBinder shareableActivityToken) {
        attachBaseContext(context);

        mFragments.attachHost(null /*parent*/);

        mWindow = new PhoneWindow(this, window, activityConfigCallback);

En el método de conexión, puede ver que mWindow es la phoneWindow creada, por lo que el método getWindow().setContentView() anterior en realidad llama al método setContentView de phoneWindow. En este método, tal código:

if (mContentParent == null)
	{
		installDecor();
	}

A continuación, veamos el código fuente del método installDecorf():

private void installDecor(){
	if (mDecor == null)
	{
		mDecor = generatorDecor();
		mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
		mDecor.setIsRootNamespace(true);
		if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0)
		{
			mDecor.postOnAnimation(mInvalidatePanelMenuRunnable);
		}
	}
	if (mContentParent == null)
	{
		mContentParent = generateLayout(mDecor);
	}
	...
}

Encontramos un código de este tipo en el método installDecor():

if (mDecor == null)
{
	mDecor = generateDecor();
}

Entonces veamos el método generateDecor():

protected DecorView generateDecor(){
	return new DecorView()
}

Aquí se crea un DecorView. Este DecorView es la Vista raíz en la Actividad. Luego vea el código fuente de DecorView. Se encuentra que DecorView es una clase interna de la clase PhoneWindow. Y heredó FrameLayout.

En installDecor, no solo existe el método generatorDecor, sino también otro método importante: getnerateLayout(DecorView drcor){}

El contenido principal de este método es cargar diferentes diseños en layoutResource según diferentes situaciones. Todos sabemos que una Actividad contiene un objeto Ventana, que es implementado por PhoneWindow. PhoneWindow usa DecorView como la vista raíz de toda la ventana de la aplicación, y este DecorView divide la pantalla en dos áreas: un área es TitleView y la otra es ContentView. El diseño que solemos escribir en la aplicación se muestra en ContentView.

Supongo que te gusta

Origin blog.csdn.net/howlaa/article/details/128505826
Recomendado
Clasificación