Jaiel
Dauergast
- 235
Hey ich möchte meine Bitmaps performant skalieren.
Das Problem ist dass ich einen horizontalen Slider in meiner app eingebaut habe der die Menüpunkte als Buttons darstellt.
Die Buttons werden dann auch skaliert nach folgendem schema
der Button der zur Auswahle steht ist groß dargestellt alle anderen 50% kleiner
wenn der User jetzt den slider bedient und sich die Positionen der Menuitems in der Liste ändert werden dann die buttons danach skaliert wie weit sie vom Menüpunkt 0 weg sind(dieser Menüpunkt ist ein Anker und auch der Punkt wo der jew Buttons dann aktiv zur Auswahl steht wenn der User draufklickt)
So jetzt das Schlimme an meiner Methode:
heir der Pseudo Code:
ich führe den Code nur aus wenn sich auch etwas verändert
ab einem bestimmten abstand haben die buttons immer diesselbe größe(ca 0.2*bildschirmbreite) deswegen skalier ich auch nur die die sich in diesem radius zwischen 0 und 20% befinden
die ressourcen sind png mit maßen 512x512
Problem: es laggt sehr sehr doll!!!
Kein Wunder wenn ich die resourcen immer wieder neu laden und neu skalieren muss....nciht nur der Ram ist dann voll sondern auch die CPU hat ganz schön was zu tun.
Mit png der größe 64x64 scheint es gut zu laufen wobei cih sagen muss dass ich ein Note 4 als Testgerät habe und der ist ja auch nciht gerade langsam
und trotzdem ächzt er bei 512x512.
man könnte jetzt auf die Idee kommen die ressourcen nciht neu zu laden sondern die Bitmaps wiederverwenden dann hätte man das decoden gespart.
jedoch verfärben sich dann die buttons weil ich schatteneffekte drin habe
bei dieser Methode werden die bitmaps allmählich immer dunkler bis sie schwarz sind je anchdem wie oft skaliert werden muss
das ist auch nciht so toll
hier ncoh meine Codehülle falls ihr nicht verstanden ahbt was ich meine:
hat jemand ein Vorschlag es anders zu amchen?
unten ein screenie der euch ein groben überblick geben soll(ich hab jetzt schnell schwarze kreise erstellt in 64x64 um es zu testen aber die Auflösung ist sagen wir mal so für die katz das kann ich nicht bringen)
Das Problem ist dass ich einen horizontalen Slider in meiner app eingebaut habe der die Menüpunkte als Buttons darstellt.
Die Buttons werden dann auch skaliert nach folgendem schema
der Button der zur Auswahle steht ist groß dargestellt alle anderen 50% kleiner
wenn der User jetzt den slider bedient und sich die Positionen der Menuitems in der Liste ändert werden dann die buttons danach skaliert wie weit sie vom Menüpunkt 0 weg sind(dieser Menüpunkt ist ein Anker und auch der Punkt wo der jew Buttons dann aktiv zur Auswahl steht wenn der User draufklickt)
So jetzt das Schlimme an meiner Methode:
heir der Pseudo Code:
Code:
MenuItem
{
member:
-bitmap
-...
...
}
For(MenuItem mI:mIList)
{
-fülle die bitmap des mI folgender maßen:
-hole die ressource aus dem res ordner
-skalier die resource in Abhängigkeit von der relativen Entfernung zum Menüpunkt 0
-überschreibe mI.bitmap
}
ich führe den Code nur aus wenn sich auch etwas verändert
ab einem bestimmten abstand haben die buttons immer diesselbe größe(ca 0.2*bildschirmbreite) deswegen skalier ich auch nur die die sich in diesem radius zwischen 0 und 20% befinden
die ressourcen sind png mit maßen 512x512
Problem: es laggt sehr sehr doll!!!
Kein Wunder wenn ich die resourcen immer wieder neu laden und neu skalieren muss....nciht nur der Ram ist dann voll sondern auch die CPU hat ganz schön was zu tun.
Mit png der größe 64x64 scheint es gut zu laufen wobei cih sagen muss dass ich ein Note 4 als Testgerät habe und der ist ja auch nciht gerade langsam
und trotzdem ächzt er bei 512x512.
man könnte jetzt auf die Idee kommen die ressourcen nciht neu zu laden sondern die Bitmaps wiederverwenden dann hätte man das decoden gespart.
jedoch verfärben sich dann die buttons weil ich schatteneffekte drin habe
bei dieser Methode werden die bitmaps allmählich immer dunkler bis sie schwarz sind je anchdem wie oft skaliert werden muss
das ist auch nciht so toll
hier ncoh meine Codehülle falls ihr nicht verstanden ahbt was ich meine:
PHP:
//Button1
mThread.Button1.bmp=Bitmap.createScaledBitmap(
BitmapFactory.decodeResource(getResources(),R.drawable.button1),
mThread.Button1.width,mThread.Button1.height,true);
//Button2
...
hat jemand ein Vorschlag es anders zu amchen?
unten ein screenie der euch ein groben überblick geben soll(ich hab jetzt schnell schwarze kreise erstellt in 64x64 um es zu testen aber die Auflösung ist sagen wir mal so für die katz das kann ich nicht bringen)
Anhänge
Zuletzt bearbeitet: