2014-03-13 12 views
7

Ich habe eine benutzerdefinierte Ansicht (Breite = 2000) in einem horizontalen Scrollview (Breite = 480). Es gibt also eine Region, die scrollbar ist.onDraw Benutzerdefinierte Ansicht in einem Scrollview

Wenn onDraw() genannt wird, das schmutzige Rechteck (zurückgegeben durch getClipBounds()) liefert die Dimensionen der ganze Sicht, so zeichne ich das ganze Sicht einschließlich des Bereichs, der nicht sichtbar ist. Als Konsequenz wird beim Scrollen onDraw() nicht mehr aufgerufen, weil die sichtbaren Bereiche bereits gezeichnet und irgendwie erinnert wurden.

public void onDraw(Canvas canvas) 
{ 
    canvas.getClipBounds(r); // returns 2000 x 400 
} 

Das funktioniert gut !!!
Allerdings kann meine benutzerdefinierte Ansicht so weit wie 20.000 oder mehr sein, und die Dinge beginnen langsam zu werden. Meine Sorge ist, dass die zwischengespeicherte Zeichnung viel Speicher verwendet. Ich glaube nicht, dass die Zeichnung als Bitmap gespeichert wird, da sie bereits abgestürzt wäre. Wie werden diese Zeichenbefehle (hauptsächlich Linien und Text) gespeichert? Gibt es eine Möglichkeit, anzugeben, dass onDraw() nur den sichtbaren Teil der Ansicht anfordern soll und beim Scrollen immer onDraw() aufruft? Oder gibt es einen anderen Ansatz?

Danke!

Antwort

3

Android verwendet hardware accelerated "display lists" zum Zeichnen seit Android 3.0. Dadurch wird die Anzeigeliste für die gesamte Ansicht zwischengespeichert. Wenn die Ansicht in der ScrollView wirklich groß ist, können Sie disable hardware acceleration für die Ansicht verwenden.

Wir tun dies, indem Subklassen Scroll und Überschreiben der onAttachedToWindow() Methode mit diesem:

@Override 
protected void onAttachedToWindow() 
{ 
    setLayerType(LAYER_TYPE_SOFTWARE, null); 
} 
+0

Sie haben wirklich mein Tag retten! Ich sehe diese Antwort bei "http://www.codeitive.com/0yxVVjeeeV/ondraw-custom-view-inside-a-scrollview.html" und es löst mein Problem, wo meine Textansicht in einem Scrollview immer einige Schluckauf beim Scrollen erzeugt . Ich suche im Internet nach dieser Antwort, um Ihnen eine Stimme zu geben. Vielen Dank. – Surely

Verwandte Themen