studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android draw surfaceview ondraw

para - manual de programacion android pdf



¿Sobrescribir onDraw() o draw()? (6)

Mi proyecto se basa en surfaceView y hasta ahora he tenido toda mi representación en onDraw, que estoy anulando. Todo parecía estar bien.

Sin embargo, acabo de actualizar mi SDK y ahora me da un error que me dice:

Método sospechoso de llamada; probablemente debería llamar "draw" en lugar de "onDraw"

¿Podría alguien explicar la diferencia entre estos dos?

He leído algunas preguntas similares en la red, pero no he encontrado una explicación que entiendo.

Gracias


Como dijo friiky, @SuppressLint("WrongCall") solucionó mi problema. Sin embargo, debe estar delante del nombre del método, no del anterior.

Lo que hice fue colocar el mouse sobre el código de error, hacer clic con el botón derecho y seleccionar Add @SuppressLint("WrongCall")


Intenté limpiar mi proyecto y resolví el problema. Intentalo.


Tenga en cuenta que en el caso de dibujar, anular dibujar () y llamar a super.draw se utiliza a menudo cuando un Grupo de vistas quiere dibujar contenido sobre sus vistas secundarias. El contenido dibujado en onDraw aparecerá debajo de los niños.


Tengo el problema desde siempre.

Lo manejo de esta manera:

1) Declara un método como el siguiente.

@SuppressLint("WrongCall") public void drawTheView() { theCanvas = null; try{ theCanvas = getHolder().lockCanvas(); if(theCanvas != null) { onDraw(theCanvas); } } finally { getHolder().unlockCanvasAndPost(theCanvas); } }

2) Ahora puedes modificar el método onDraw ():

@Override public void onDraw(Canvas canvas) { //Do some drawing }

Puede llamar al método drawTheView () desde cualquier lugar que desee y llamar al método onDraw () de esta manera sin recibir el error ...

Creo que esta es una forma práctica.


SurfaceView.draw() básicamente llama a View.draw(); Si desea implementar su dibujo, debe hacerlo en View.onDraw() que es para que usted lo implemente, lo que incluso dice en los comentarios del código fuente.

ViewGroup.drawChild () llama a este método para que cada vista secundaria se dibuje. Este método draw () es un detalle de implementación y no está diseñado para ser anulado o para ser llamado desde otro lugar que no sea ViewGroup.drawChild ().

En cuanto a la diferencia entre ellos:
dibujar():

13416 /* 13417 * Draw traversal performs several drawing steps which must be executed 13418 * in the appropriate order: 13419 * 13420 * 1. Draw the background 13421 * 2. If necessary, save the canvas'' layers to prepare for fading 13422 * 3. Draw view''s content 13423 * 4. Draw children 13424 * 5. If necessary, draw the fading edges and restore layers 13425 * 6. Draw decorations (scrollbars for instance) 13426 */

onDraw () está vacío. Es para que usted lo implemente.


onDraw te da un lienzo para dibujar en la pantalla.

draw() permite dibujar manualmente un lienzo en la pantalla (usted mismo debe hacer el lienzo).