2012-04-13 9 views
6

Ho una libreria di disegni e con essa ho una vista personalizzata. Quando è necessario eseguire aggiornamenti, la libreria chiama il metodo invalidate() della vista. E poi viene chiamato il metodo onDraw(), e tutto funziona perfettamente.View.invalidate() non sembra chiamare View.onDraw()

Tuttavia, quando aggiungo l'attributo di usesSdkVersion="14" al mio AndroidManifest.xml file, questo smette di funzionare. Il metodo onDraw() della mia vista non viene più richiamato.

MORE INFO: Sembra che quando chiamo invalidate() come il risultato di un pulsante nella mia app, la vista gli aggiornamenti come previsto. Inoltre, c'è una animazione all'interno della mia libreria che funziona correttamente. Quindi a quanto pare a volte funziona correttamente. Ma la maggior parte delle volte non viene ridisegnata. C'è uno stato in cui può essere inserita una vista personalizzata che farebbe sì che il sistema operativo salti il ​​ridisegno dopo che è stato chiamato lo invalidate()?

+0

Stai ancora chiamando dal thread dell'interfaccia utente? altrimenti è necessario utilizzare postInvalidate(). – Heinrisch

+0

Ho provato a modificare l'invalidate to postInvalidate solo per verificarlo, e il problema esiste ancora. – Rickster

+0

L'accelerazione hardware è attivata o disattivata? –

risposta

5

Da Android 3.0, quando si utilizza l'accelerazione hardware, il disegno delle viste viene registrato e memorizzato nella GPU.

Quindi, quando si ha ottenuto due punti di vista: A di cui sopra B, e si chiamano B.invalidate, B.onDraw saranno chiamati e registrare alla GPU, ma A.onDraw non sarà chiamato perché è già registrato!

Questa è la diversa dalla modalità di accelerazione non hardware quando sono state richiamate tutte le viste onDraw.

2

da documenti ufficiali:

Tuttavia, poiché l'accelerazione hardware non è supportata per tutte le operazioni di disegno 2D, accenderlo potrebbe influenzare alcune delle vostre applicazioni che utilizzano visualizzazioni personalizzate o chiamate di disegno. I problemi di solito si manifestano come elementi invisibili, eccezioni o pixel resi in modo errato.

Per rimediare a questo, Android ti dà la possibilità di attivare o disattivare l'accelerazione hardware ai seguenti livelli:

applicazione

<application android:hardwareAccelerated="true" ...> 

Attività

.

Finestra

GetWindow() SetFlags (WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

View

myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

I test a mio avviso.

1

Sembra un bug in Android. Invece di invalidate() tenta di utilizzare il metodo dello stesso nome con quattro parametri:

view.invalidate(0,0,view.getWidth(), view.getHeight()); 

proposito, è meglio pratica per invalidare solo quella regione, che sta cambiando. Passa a sinistra, in alto, a destra, in basso le coordinate della regione invalida.

Problemi correlati