2009-08-21 10 views
2

Für die Anwendung, an der ich gerade arbeite, habe ich etwas wie ImageSwitcher für mehrere Bilder erstellt (stell dir vor iPhone's UIScrollView mit aktiviertem Paging).Optimieren von Paging zwischen ImageViews in Android?

Zuerst habe ich einige ImageViews fest codiert und ihre zeichnbaren Ressourcen auf Erstellung/Inflation geladen, aber nach einigen Verbesserungen (und was ich dachte, Verbesserungen waren), reduzierte ich die benötigten Ansichten auf 3, von denen 2 für ImageViews verwendet werden Anzeige der aktuellen Seite und Animation zwischen aktueller und neuer Seite.

Mit dieser Änderung, begann ich in meinem 2 ImageViewssetImageResource/setImageDrawable für die dynamische Belastung des neuen Bildes zu verwenden, bevor Sie durch die Seiten Schieben (I PNG-Dateien verwenden, für HVGA-Displays Größen sortiert ist).

Zu meiner Enttäuschung verschlechterte sich die Leistung, und es kam zu einer gewissen Verzögerung, wenn man schneller durch die Seiten glitt. Ein kurzer Blick in TraceView ergab, dass 17,4% der Gesamtzeit bei der Verwendung der App, mehr als 5-mal mehr als die nächste schwere Methode, von BitmapFactory.nativeDecodeAsset verbraucht wurde, aufgerufen von meiner dynamischen Einstellung der Zeichnungs-Ressource.

Ich denke über Möglichkeiten, dies zu umgehen, und ich möchte es auf die bestmögliche Weise tun, so dass alle Vorschläge willkommen sind.

+0

Es klingt, als ob Sie ImageSwitcher neu erfunden haben. ImageSwitcher macht genau das: 2 ImageViews, die für die Anzeige des aktuellen Bildes und des nächsten Bildes verwendet werden. Anders als es klingen mag, wird es nicht nur dazu verwendet, zwischen den beiden Bildern hin- und herzuwechseln, wie es zunächst scheinen mag. Ich benutze es oft für solche Dinge wie das Animieren von Bildern durch einen ganzen Feed (und einen anderen Schalter, um die Titel auch zu animieren). Ich weiß nicht, dass dies Ihre Leistungsprobleme lösen wird, aber es könnte zumindest einige Faktoren ausklammern. – lilbyrdie

+0

Danke für den Vorschlag. Ich musste ImageSwitcher aus mehreren Gründen neu erfinden - erstens, weil ich damit begann, mehrere ImageViews zu enthalten, und dann auf die aktuelle Ansicht und Hilfesicht reduziert, zweitens, weil ich die Kontrolle über eine andere TextView-Komponente haben wollte leicht erreichbar von den ImageViews - ich dachte, ich werde die Hierarchie abflachen und meine benutzerdefinierte Switcher-Ansicht verwenden, die nur tun wird, was ich tun soll. Am Ende, nach dem Spielen mit AllocationTracker und TraceView, glaube ich nicht, dass das Problem in der benutzerdefinierten ViewGroup ist. –

Antwort

1

In welchem ​​Format haben Sie die Bilder?

Android arbeitet nativ mit RGB565-Bildern. Wenn Sie also Ihre Bilder in dieses Format konvertieren können, ist die Decodierung viel schneller.

+0

Hallo, ich habe erwähnt, dass ich die Bilder im PNG-Format bekomme, aber ich weiß nicht, ob der Puffer für diese Dateien RGB 565 ist (das ist 16-Bit HighColor, oder?). Ich habe versucht, Bitmap direkt von Bild in .rgb565 konvertiert, aber Android BitmapFactory scheint nicht damit zu arbeiten. Wie auch immer, danke für die Idee. –