¿Estoy invalidando toda la pantalla en cada llamada?

Soy nuevo en Android Development y leo el libro Hello Android . Utiliza un ejemplo de Sudoku, y el código al que me estoy refiriendo está aquí.

En esto, onTouchScreen, llama al método select, que llama invalidar dos veces. La pregunta es que, al invalidating es el método onDraw llamado justo después de eso? Así será en este caso, dentro de mi método selecto, lo hará

  1. invalidar
  2. Llamada onDraw
  3. Hacer algunas cosas
  4. invalidar
  5. Llamada onDraw

¿Es así como sucederá, también, se regenerará toda la pantalla? Todos los números y consejos, etc., porque del libro el autor dice

En una versión anterior de este ejemplo, invalidé toda la pantalla cada vez que se movía el cursor. Así, en cada prensa de llaves, todo el rompecabezas tenía que ser rediseñado. Esto hizo que lag notablemente. Cambiar el código para invalidar sólo los rectángulos más pequeños que cambiaron lo hizo correr mucho más rápido.

¿Qué es exactamente lo que está tratando de decir aquí?

Información añadida

He añadido algunos registros en el método onDraw, algunos en el inicio, algunos en el bucle for. Cada vez que tocaba un nuevo rectángulo, se llamaban todos los registros. ¿No significa que toda la pantalla se está repoblando, ya que todo el código en onDraw se vuelve a ejecutar?

Kraken

P: Pero ¿qué pasa con los registros, seguramente si mis bucles se están ejecutando significa que todos los canvas.draw se ejecutará también?
R: Sí, todo el dibujo se ejecutará en su código de ejemplo. Tienes que optimizar el proceso de renderizado por ti mismo, en el método onDraw .

P: ¿Cómo sabe el sistema, qué pieza de código "sólo" volverá a dibujar el área sucia?
A: Canvas::getClipBounds le dará un rect de sucio, que debe dibujar algo.
Dentro de su for loop en onDraw , compare el rect sucio con el rect que desea dibujar. Entonces continue si no se cruzan.

Pero recuerde, si tiene varias áreas definidas como sucias, la rect rectangular será una unión de todas las áreas sucias.
Vea las siguientes dos preguntas a continuación:
Obteniendo la región sucia dentro de draw ()
Android: invalidar (sucio)

Espero que esto te ayudará.

==========================

El autor tiene razón. Pero esto todavía se puede optimizar.

Al llamar invalidate(Rect) se establecerá automáticamente un área de clip para el lienzo. (Es por eso que canvas.getClipBounds() puede devolver ese área).
Entonces, durante onDraw() , cualquier cosa que se dibuje fuera del área del clip, será ignorada. No aparecen en la pantalla, por lo que realmente reducir el tiempo de dibujo.
Pero hacer caso omiso de ellos todavía cuesta por encima. Por lo tanto, para aplicaciones gráficas intensivas, onDraw() podría optimizarse mejor si las excluye de antemano.

Usted puede encontrar un gran ejemplo para optimizar onDraw() en KeyboardView de android, que proporcionan la vista del método de entrada de su Android. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/inputmethodservice/KeyboardView.java

Esto es directamente de la documentación Ver :

El dibujo se maneja caminando el árbol y representando cada vista que cruza la región inválida. Debido a que el árbol es atravesado en orden, esto significa que los padres dibujarán antes (es decir, detrás) de sus hijos, con hermanos dibujados en el orden en que aparecen en el árbol. Si establece un fondo dibujable para una vista, la vista lo dibujará para usted antes de volver a llamar a su método onDraw ().

Tenga en cuenta que el marco no dibujará vistas que no estén en la región no válida.

Por lo que entiendo, una vez que su vista se dibuja por primera vez, un árbol si se formó con el padre y los objetos secundarios junto con sus posiciones en la pantalla. Cuando se pasa un área designada para invalidar, se verifica que este árbol tiene nodos afectados en esa zona y sólo se llamarán a estos nodos para dibujar.

Ahora lo que también no entiendo es que en este ejemplo, la única vista es la PuzzleView. No estoy seguro de cómo un dibujo de una sola vista se puede optimizar. Compruebe si se discute más en el texto.

Si no lo es, entonces mi teoría sería que los objetos de lienzo (rectángulos) también forman parte del árbol mencionado arriba y sólo se dibujan las partes, es decir, los rectángulos en el área especificada.

Lo que es más importante, ¿ves alguna mejora después de usar el área invalidate vs invalidate completo?

Incluso si llama invalidar varias veces el método onDraw sólo se llamará una vez. Básicamente el onDraw se llama dentro del método RunLoop cuando una vista ha sido invalidada. Esto significa que si invalida la vista varias veces antes de devolver el control al runloop, la vista se volverá a dibujar sólo una vez. Tenga en cuenta que si invalida dos recortes diferentes de la vista, el sistema tratará de realizar una unión de estos últimos antes de volver a dibujar su vista.

En el código, el invalidado de que usted está hablando es éste:

  invalidate(selRect); 

?

Si es que sólo llama al onDraw de este selRect rectángulo seleccionado.

Sólo el invalidate(); Vuelve a dibujar la pantalla del agujero.

Espero eso ayude.

En este ejemplo, debe observar que invalidate() llamadas tienen un Rect como parámetro. Esto significa que sólo esta zona de la vista se ensucia y va a ser rediseñada por el sistema.

Llamar invalidate () no activará el método onDraw () inmediatamente después. El sistema sólo decide cuando quiere volver a dibujar la vista.

De la documentación de Android:

Si la vista es visible, onDraw (android.graphics.Canvas) se llamará en algún momento en el futuro.

Sabiendo que, dentro del método select , esto probablemente ocurrirá: 1. Invalidar una pequeña porción de la Vista 2. Hacer algunas cosas 3. Invalidar otra pequeña porción de la Vista 4. Las tesis 2 porciones de la Vista se están volviendo a dibujar

Espero que ayudó.

  • Limpiar el lienzo con Canvas.drawColor ()
  • ¿Cómo animar gradiente?
  • Cómo dibujar la forma de triángulo y añadirlo en la distribución relativa o lineal de android
  • PorterduffXfermode: borra una sección de un mapa de bits
  • Dibujo sobre lienzo fuera del método onDraw ()
  • ¿Cómo establecer el tamaño de la lona?
  • Flash en un WebView de Android - problema de capas
  • Cómo dibujar en un lienzo de vista sin upscaling artefactos cuando el padre de vista tiene un factor de escala?
  • Cómo dibujar Arco entre dos puntos en el lienzo?
  • OnDraw Vista personalizada dentro de un Scrollview
  • Cómo utilizar el teclado suave android en SurfaceView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.