2010-04-06 2 views
7

Ich bin neu in der Android-Entwicklung, ich lese gerade Dokumente und versuche die APIs. Ich bin ziemlich verwirrt darüber, wie ImageView es geschafft hat, nur einen Teil von seinen Inhalt nach einem Invalidate (Rect) Aufruf zu zeichnen.Wie wird ImageView nur einen Teil seines Inhalts neu zeichnen, wenn Ungültigmachen (Rect) aufgerufen wird?

I ImageView.java geprüft habe, fand keine andere Ziehverfahren außer OnDraw (Canvas), aber OnDraw (Canvas) schneiden nur die ziehbar nur, wenn es beyound die sichtbare Grenze Sicht ist. Ich lese auch die Implementierung von View.invalidate (Rect), ich denke, der Schlüssel dieser Funktion ruft mParent.invalidateChild (this, r); Allerdings denke ich, dass die Elternansicht nicht weiß, wie man das Kind in das gegebene Rect zeichnet, muss es schließlich eine Methode des Kindes benennen, um zu malen.

Hat jemand diesen Teil der Codes untersucht? Würdest du mir bitte einige Hinweise geben?

Antwort

1

Ich denke, dass der Code in der View Klasse ist.

Es gibt zwei interessante Antworten von Romain Guy in der Google-Gruppe.

+0

-1, da beide Links jetzt tot sind. Ein Teil ihres Inhalts wäre hier besser gewesen. –

+1

+1, weil die Links nicht tot sind ... Ich habe sie gerade getestet. Ich stimme jedoch zu, dass das Hinzufügen von Inhalten in solchen Fällen eine gute Sache ist. – Justin

0

Ich denke, android die Ansicht ziehen wie Leinwand in J2ME, die alle die Auslosung Code nicht direkt auf Hardware zeichnen (Bildschirm), es nur auf einen Puffer zeichnen oder ziehbar oder so etwas. Wenn wir View.invalidate (Rect) aufrufen, kopiert das System das Bild im Rekt des Puffers (oder Zeichensatzes) in die Hardware (Bildschirm).

3

Soweit ich feststellen kann gibt es zwei Optimierungen gehen eins. Wenn das Kind eine Viewgroup ist, werden nur die Kinder dieser Gruppe neu gezeichnet, die den ungültigen Bereich schneiden. Außerdem wird die Zeichenfläche an die Grenzen dieses Rechtecks ​​angepasst. Dies bedeutet, dass weniger Pixel durch den Bus zum Framebuffer gemischt werden müssen und dass vollständig ausgeschnittene Zeichenoperationen übersprungen werden können.

Dies ist eine halbwegs Vermutung. Ich habe die Quelle vor ein paar Monaten durchsucht und bin mir ziemlich sicher über die ViewGroup-Sache. Der zweite Test kann getestet werden, indem Clipping in onDraw überschrieben und überprüft wird, ob alles neu gezeichnet wird.

+0

Ich bin ein Novize auf Android und ich habe eine Frage hier http://StackOverflow.com/Questions/21027199/am-in-invalidating-the-Entire-Screen-on-every-call Bitte geben Sie die Antwort, wenn möglich . – Kraken

Verwandte Themen