2012-04-13 14 views
6

Ich habe eine Zeichnungsbibliothek, und damit habe ich eine benutzerdefinierte Ansicht. Wenn Aktualisierungen durchgeführt werden müssen, ruft die Bibliothek die Methode invalidate() der Ansicht auf. Und dann wird die onDraw() Methode aufgerufen, und alles funktioniert gut. Wenn ich jedoch das Attribut usesSdkVersion="14" zu meinem AndroidManifest.xml file hinzufüge, funktioniert das nicht mehr. Nicht mehr wird die onDraw() Methode meiner Ansicht mehr aufgerufen.View.invalidate() scheint View.onDraw() nicht aufzurufen

MORE INFO: Es scheint, dass, wenn ich invalidate() als Ergebnis einer Schaltfläche Push in meiner App aufrufen, wird die Ansicht wie erwartet aktualisiert. Außerdem gibt es eine Animation in meiner Bibliothek, die korrekt funktioniert. So scheint es manchmal manchmal richtig zu funktionieren. Aber die meiste Zeit wird es nicht neu gezeichnet. Gibt es einen Zustand, in dem sich eine benutzerdefinierte Ansicht befinden könnte, die dazu führen würde, dass das Betriebssystem es erneut erstellt, nachdem invalidate() aufgerufen wurde?

+0

Rufen Sie es noch über den UI-Thread an? Andernfalls müssen Sie postInvalidate() verwenden. – Heinrisch

+0

Ich habe versucht, das Invalidate zu PostInvalidate zu ändern, nur um das zu überprüfen, und das Problem besteht weiterhin. – Rickster

+0

Ist die Hardwarebeschleunigung ein- oder ausgeschaltet? –

Antwort

5

Von Android 3.0, wenn Hardware-Beschleunigung verwendet wird, wird das Zeichnen von Ansichten aufgezeichnet und auf der GPU gespeichert. So

, wenn Sie bekam zwei Ansichten: A über B, und rufen Sie B.invalidate, B.onDraw wird auf die GPU genannt und aufzeichnen, aber A.onDraw wird nicht genannt werden, da sie bereits aufgezeichnet wird!

Dies ist der Unterschied zum Nicht-Hardware-Beschleunigungsmodus, wenn alle Ansichten onDraw aufgerufen wurden.

2

von offiziellen Dokumenten:

Da jedoch die Hardware-Beschleunigung ist nicht für alle der 2D-Zeichenoperationen unterstützt, es einschalten könnten einige Ihrer Anwendungen auswirken, die benutzerdefinierte Ansichten oder Zeichnungs Anrufe verwenden. Probleme treten normalerweise als unsichtbare Elemente, Ausnahmen oder falsch wiedergegebene Pixel auf.

Um dies zu beheben, Android bietet die Möglichkeit, die Hardware-Beschleunigung auf folgenden Ebenen zu aktivieren oder deaktivieren:

Anwendung

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

Aktivität

.

Fenster

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

Ansicht

myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

Ich teste aus meiner Sicht.

1

Es scheint wie ein Fehler in Android. Statt invalidate() versuchen, mit vier Parametern Methode mit dem gleichen Namen zu verwenden:

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

By the way, es besser ist es nur, dass die Region zu entkräften, die verändert. Pass links, oben, rechts, unten Koordinaten der ungültigen Region.