2012-08-11 16 views
21

Pongo una llamada Log.d() en el onDraw() de mi Vista extendida, para poder ver con qué frecuencia y cuándo se llama. Se recurre a la creación de instancias de la vista, lo cual no es sorprendente. Pero luego me doy cuenta, se llama en cada toque que maneja onTouchEvent(), aunque mi código allí no está haciendo nada remotamente relacionado con los gráficos. Sin embargo, en el documentation para Vistas, parece que no puedo encontrar nada sobre cuándo realmente se llama a onDraw(). No estoy realmente preocupado por mi proyecto particular aquí (esto no me causa ningún problema), solo me gustaría saber si hay una lista en alguna parte o algo que muestre el orden de las operaciones de una Vista, particularmente las causas onDraw() para recibir una llamada.View.onDraw() --- ¿cuándo se llama?

Respuesta

45

yo sepa, es una visión onDraw() se llama cuando:

  1. La vista se dibuja inicialmente
  2. Siempre invalidate() se llama en la vista

Invalidate puede ser llamado por usted o el sistema siempre que sea necesario. Por ejemplo, muchas vistas cambian su apariencia en toque, como un texto de edición que obtiene un contorno y un cursor, o un botón en estado comprimido. Debido a esto, las vistas se vuelven a dibujar al tocar.

Acepto que sería bueno tener un documento que detalla el funcionamiento de Views, y si existe uno y alguien sabe dónde encontrarlo, por favor háganoslo saber.

+0

Este no es el caso para 'ViewGroup's. Vea mi respuesta http : //stackoverflow.com/a/34367199/1642079 –

7
  • Si establece un fondo para un dibujable, finalmente, la vista se basará para usted antes de volver a llamar a su método onDraw().

  • onAttachedToWindow() se invoca cuando la vista se adjunta a una ventana. En este punto, tiene una superficie y comenzará a dibujar. Tenga en cuenta que se garantiza que esta función se llama antes de onDraw (android.graphics.Canvas), sin embargo se puede llamar en cualquier momento antes del primer onDraw, incluso antes o después de onMeasure (int, int).

  • invalidate() marque el área definida por "sucio" como necesario dibujar. Si la vista es visible, se llamará a onDraw (android.graphics.Canvas) al en algún punto en el futuro.

+0

Es una forma que podemos interceptar antes de volver a llamar a onDraw(). ¿Desea verificar mi pregunta? http://stackoverflow.com/questions/19052952/bitmap-change-will -make-view-auto-refresh-before-ondraw-and-regardless-invalid – VinceStyling

1

Una cosa importante a tener en cuenta es que tratan de minimizar la llamada de la función de invalidación() sin argumentos. En su lugar, intente maximizar la función invalidate() con cuatro argumentos. Como dibujar toda la vista es muy caro. La segunda variante actualiza solo la parte de la vista.

8

onDraw() se llama cuando se llama invalidate().

Pero usted debe saber para ViewGroups: onDraw() no se llamará como usted espera. Más bien, onDispatchDraw().

Sin embargo, en un ViewGroup puede llamar al setWillNotDraw(false) en el constructor para llamar al invalidate().

Tome un vistazo a this answer

0

Adicional a lo anterior: El teclado de software provoca un View.invalidate() -> View.onDraw() secuencia después de cambiar el tamaño de la ventana para dar cabida a la sensatez 'teclado' . Un personalizado View.onDraw() debe dejarse en un estado que anticipa esta posibilidad.
Este fenómeno explica por qué la aplicación que desarrolló y probó en una tableta con un teclado bluetooth fue para los perros una vez que llegó al mundo real (-:

Cuestiones relacionadas