studio programacion herramientas fundamentos con avanzado aplicaciones android graphics ondraw

programacion - manual de android en pdf



View.onDraw()-¿cuándo se llama? (5)

Puse una llamada Log.d () en el onDraw () de mi Vista extendida, para poder ver con qué frecuencia y cuándo se llama. Se llama a la instanciación de la vista, lo que no es sorprendente. Pero luego me doy cuenta de que se activa en cada toque que maneja onTouchEvent (), aunque mi código no hace nada relacionado de forma remota con los gráficos. Sin embargo, en la documentation de Vistas, parece que no puedo encontrar nada sobre cuándo se llama en realidad 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 algún lugar o algo que muestre el orden de las operaciones de una Vista, particularmente las causas. onDraw () para ser llamado.


  • Si establece un dibujo de fondo para una Vista, entonces la Vista lo dibujará por usted antes de volver a llamar a su método onDraw ().

  • Se llama a onAttachedToWindow () 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 llamará 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).

  • invalidar () marca el área definida por sucio como necesidad de dibujar. Si la vista es visible, se llamará a onDraw (android.graphics.Canvas) en algún momento en el futuro.


AFAIK, se llama onDraw () de una Vista cuando:

  1. La vista se dibuja inicialmente.
  2. Siempre que se llame a invalidate() en la vista

Invalidate puede ser llamado por usted o por el sistema cuando sea necesario. Por ejemplo, muchas Vistas cambian su apariencia en Toque, como si un Texto de Edición obtuviera un contorno y un cursor, o un botón en estado presionado. Debido a esto, las vistas se redibujan al tacto.

Estoy de acuerdo en que sería bueno tener un documento que detallara el funcionamiento de las Vistas, y si existe una y alguien sabe dónde encontrarla, háganoslo saber.


Además de lo anterior: el teclado virtual genera una secuencia View.invalidate () -> View.onDraw () después de cambiar el tamaño de la ventana para que se ajuste al ''teclado''. Un View.onDraw () personalizado debe dejarse en un estado que anticipa esta posibilidad.
Este fenómeno explica por qué la aplicación que usted desarrolló y probó en una tableta con un teclado Bluetooth fue para los perros una vez que llegó al mundo real (-:


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


onDraw() cuando se llama a invalidate() .

Pero debe saber para ViewGroups: no se llamará a onDraw() como espera. En su lugar, onDispatchDraw() .

Sin embargo, en un ViewGroup puede llamar a setWillNotDraw(false) en el constructor para hacer que onDraw() sea ​​invocado en invalidate() .

Echa un vistazo a esta respuesta.