2010-12-31 7 views
1

Ich bin neu in der Android-Entwicklung und stoße auf ein schwieriges Problem, wenn ich versuche, eine Grafikzeichnung auf einer View zu implementieren.Die onDraw-Methode von View wird immer wieder auf Android 2.2 aufgerufen.

Was ich tun möchte, ist ein Diagramm in einer Ansicht zu zeichnen. Ich legte eine Ansicht in eine ScrollView und überschreibe die OnDraw-Methode von View und Zeichnen in OnDraw. Das Wichtigste ist, dass das Diagramm Scroll-Funktionen benötigt. Die OnDraw-Methode der View überschreibt die Koordinatenberechnung und viele notwendige Elemente (Linie, Punkt, Achse, Beschriftung usw.) in einem Diagramm. Wie Sie sich vorstellen können, berechne und zeichne ich das ganze Diagramm nicht nur den sichtbaren Bereich, sondern den gesamten Bereich einschließlich Offscreen. Jetzt ist das Problem, dass onDraw Methode immer wieder aufgerufen wird, wenn ich die ScrollView blättern, so dass es ein Leistungsproblem verursacht und die Bildlaufansicht sehr langsam ausgeführt wird. Ich habe versucht, einen Weg zu finden, den Aufruf von onDraw nach dem ersten Anruf zu verhindern, aber kein Glück. Ich muss das selbe immer wieder einmal aufDraw berechnen, was nicht nötig ist.

Haben Sie eine Antwort? Vielen Dank.

Antwort

0

Mit mScrollX und mScrollY können Sie berechnen, welcher sichtbare Teil des Canvas erneut gezeichnet werden muss.

/** 
* The offset, in pixels, by which the content of this view is scrolled 
* vertically. 
* {@hide} 
*/ 
@ViewDebug.ExportedProperty 
protected int mScrollY; 

/** 
* The left padding in pixels, that is the distance in pixels between the 
* left edge of this view and the left edge of its content. 
* {@hide} 
*/ 
@ViewDebug.ExportedProperty 
protected int mPaddingLeft; 
/** 
* The right padding in pixels, that is the distance in pixels between the 
* right edge of this view and the right edge of its content. 
* {@hide} 
*/ 
@ViewDebug.ExportedProperty 
protected int mPaddingRight; 
/** 
* The top padding in pixels, that is the distance in pixels between the 
* top edge of this view and the top edge of its content. 
* {@hide} 
*/ 
@ViewDebug.ExportedProperty 
protected int mPaddingTop; 
/** 
* The bottom padding in pixels, that is the distance in pixels between the 
* bottom edge of this view and the bottom edge of its content. 
* {@hide} 
*/ 
@ViewDebug.ExportedProperty 
protected int mPaddingBottom; 
+0

Ich hoffe, Sie verwenden diese nicht, da sie keine öffentlichen APIs sind. Die öffentlichen APIs zum Abrufen des Scroll-Offsets sind: http://developer.android.com/reference/android/view/View.html#getScrollX() – hackbod

+0

Sie meinen, ich muss den sichtbaren Bereich noch neu berechnen? Ich bevorzuge, dass es nur einmal nach der Ansicht berechnet wird, die dem Benutzer zuerst gezeigt wird, weil die ganze Leinwand immer gleich ist, während der Benutzer sie scrollt, und ich denke, es kostet Zeit, sie neu zu berechnen, und tatsächlich verursacht es das Leistungsproblem tatsächlich Ich zeichne einfach ein Rechteck darauf. Gibt es da trotzdem zu vermeiden, das beim Scrollen immer wieder neu zu berechnen? –