¿La solicitud de llamadaLayout o invalidar múltiples veces perjudica el rendimiento?

Para mover una vista alrededor llamo setX, setY, y algunas otras funciones que fijan el ancho y la altura y llaman invalidate o requestLayout al final de cada una de estas funciones. Como resultado invalidate y requestLayout se llama varias veces por evento de usuario. ¿Esto desencadena varios diseños / dibujos por evento de usuario?

Por supuesto no. Podemos ver código en ViewRootImpl

void invalidate() { mDirty.set(0, 0, mWidth, mHeight); if (!mWillDrawSoon) { scheduleTraversals(); } } 

Invalidate set dirty area, y call scheduleTraversals, llamará a doTraversal.

  void doTraversal() { if (mTraversalScheduled) { mTraversalScheduled = false; mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier); if (mProfile) { Debug.startMethodTracing("ViewAncestor"); } performTraversals(); if (mProfile) { Debug.stopMethodTracing(); mProfile = false; } } } 

Podemos ver mTraversalScheduled bandera en el código, si estamos programando viajar, un invalidate eventos triggerd, mTraversalScheduled es falso en doTraversal, por lo que el método volverá directamente. Así que NO todos los eventos inválidos llamados performTravel, NO todos los eventos invalidate llamados redraw

Sí, lo hace. Cada vez que llame invalidar, la vista en sí se volverá a dibujar!

Cada vez que llame invalidar, la vista en sí se volverá a dibujar!

Eso no es técnicamente cierto. invalidate establecerá una bandera en la vista que la hace elegible para redibujar.

Una prueba sencilla sería poner una sentencia de registro en onDraw , luego invocar invalidate en un loop. Verá que no hay un registro para cada iteración.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.