2012-04-09 17 views
15

Non ne sono molto chiaro e nemmeno i documenti.Devo richiamare super.onDraw() in una vista personalizzata?

Quando sto creando una visualizzazione personalizzata, sovrascrivo in questo modo:

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

    //more code here... 
} 

La mia domanda è se è necessario chiamare super.onDraw(canvas);. Il codice sembra funzionare bene senza di esso, ma voglio essere sicuro che sia giusto lasciarlo fuori.

Quindi è necessario?

+0

Non so se è necessario, ma è una buona pratica in linea di principio. – trutheality

+0

Devi solo chiamare 'super.onDraw()' se vuoi che il codice sia implementato anche nelle implementazioni della superclasse. Se non si fa affidamento sul disegno della superclasse personalizzata di 'View' (ad esempio, tutto il disegno richiesto viene eseguito nel metodo sovrascritto localmente), non è necessario chiamarlo, a meno che la documentazione non indichi esplicitamente il contrario. –

risposta

13

Se si desidera chiamare il metodo superclass onDraw (si pensi a TextView o KeyboardView anziché a una vista generica), quindi chiamare super.onDraw. Se non lo vuoi, cioè stai progettando di disegnare tu stesso l'intera View (che sembra che tu sia), non c'è motivo di chiamarlo.

Inoltre, se si sta estendendo la vista (e non una classe che estende la vista), super.onDraw in realtà non fa nulla.

Per me, chiamo super.onDraw quando voglio disegnare linee su KeyboardView. Quindi, super.onDraw disegna la tastiera e il mio custom LatinKeyboardView (che estende KeyboardView) disegna il percorso di scorrimento sulla parte superiore della tastiera.

+0

Sì, ho la seconda volta che KeyboardView richiede super.onDraw() se vuoi disegnare qualcosa in più sui tasti. –

0

Non è necessario se non si sta sovrascrivendo il metodo onDraw(). Se la nuova classe non la sovrascrive, verrà chiamato automaticamente il metodo del super.

+0

? Nella mia domanda scrivo chiaramente che io * sto * sovrascrivendolo ... – yydl

+0

@yydl allora sì lo sarebbe. – Whymarrh

2

Sì, lo è. Se hai personalizzato un TextView, il super.onDraw si assicurerà di disegnare qualunque cosa appartenga agli attributi TextView (come il testo, il colore del testo, l'ombra del testo, ecc ...) Lo stesso con altri Visualizzazioni come Button, CheckBox ...

Nel caso in cui la Vista personalizzata estenda Vista (non una sottoclasse specifica di Vista, solo Vista), è comunque meglio lasciare super.onDraw (tela) per alcuni metodi di disegno di View (come setBackgroundDrawable, ecc ...)

8

Una sbirciatina al codice sorgente indica che View.onDraw() è un metodo vuoto. Quindi, chiamando super.onDraw(), se la classe genitore è la stessa View, non fa nulla. È inutile e innocuo.

Se andare avanti e farlo comunque è una questione separata di efficienza, sicurezza e stile.

Problemi correlati