2012-04-09 8 views
15

No estoy demasiado claro sobre esto y tampoco lo son los documentos.¿Debo devolver la llamada a super.onDraw() en una vista personalizada?

Cuando estoy creando una vista personalizada, puedo reemplazar este modo:

@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    //more code here... 
} 

Mi pregunta es si es necesario llamar super.onDraw(canvas);. El código parece funcionar bien sin él, pero quiero estar seguro de que está bien dejarlo fuera.

¿Es necesario?

+0

No sé si es necesario, pero es una buena práctica en principio. – trutheality

+0

Solo necesita llamar a 'super.onDraw()' si desea que el código implemente la superclase también se ejecute. Si no confía en el dibujo que tiene su superclase 'View' personalizada (por ejemplo, todo el dibujo requerido se realiza en su método reemplazado localmente), entonces no necesita llamarlo, a menos que la documentación indique explícitamente lo contrario. –

Respuesta

13

Si desea que llame a la superclase método OnDraw (piense en TextView o KeyboardView en lugar de una vista genérica), llame a super.onDraw. Si no quiere eso, es decir, si planea dibujar toda la Vista usted mismo (lo cual parece que es), no hay razón para llamarlo.

Además, si está extendiendo View (y no alguna clase que extienda la vista), super.onDraw realmente no hace nada.

Para mí, llamo a super.onDraw cuando quiero dibujar líneas sobre un KeyboardView. Entonces, super.onDraw dibuja el teclado, y mi LatinKeyboardView personalizado (que amplía KeyboardView) dibuja la ruta de deslizamiento en la parte superior del teclado.

+0

Sí, en segundo lugar, KeyboardView requiere super.onDraw() si desea dibujar algo adicional en las teclas. –

0

No es necesario a menos que en realidad esté anulando el método onDraw(). Si la nueva clase no lo anula, se llamará automáticamente al método de super.

+0

? En mi pregunta, claramente escribo que estoy * sobreescribiéndola ... – yydl

+0

@yydl, entonces sí, sería. – Whymarrh

2

Sí, lo es. Si personalizas un TextView, el super.onDraw se asegurará de dibujar lo que pertenezca a los atributos TextView (como el texto, color de texto, sombra de texto, etc.) Lo mismo con otras Vistas como Button, CheckBox ...

En caso de que su Vista personalizada extienda Vista (no una subclase específica de Vista, simplemente Vista), es mejor dejar super.onDraw (canvas) allí para algunos métodos de dibujo de Vista (como setBackgroundDrawable, etc ...)

8

Un vistazo al código fuente muestra que View.onDraw() es un método vacío. Entonces, llamando al super.onDraw(), si la clase principal es View, no hace nada. Es innecesario pero inofensivo.

Si usted debe seguir adelante y hacerlo de todos modos, es una cuestión separada de eficiencia, seguridad y estilo.

Cuestiones relacionadas