Logik hinter Bitmaps und Canvas

  • 2 Antworten
  • Neuester Beitrag
Diskutiere Logik hinter Bitmaps und Canvas im Android App Entwicklung im Bereich Betriebssysteme & Apps.
T

TM_

Neues Mitglied
Hallo,
Ich hatte mal eine Frage zu grafischen Effekten von SVGs gestellt. Nun habe ich herausgefunden, dass für SVGs keine solche Effekte unterstütztwerden, doch es soll laut diesem code möglich sein, eine svg in eine Bitmap zu laden und mit den Bitmap-Methoden solche Effekte zu machen:
Code:
// Read an SVG from the assets folder
   SVG  svg = SVG.getFromAsset(getContext().getAssets(), filename);
   // Create a canvas to draw onto
   if (svg.getDocumentWidth() != -1) {
      Bitmap  newBM = Bitmap.createBitmap(Math.ceil(svg.getDocumentWidth()),
                                          Math.ceil(svg.getDocumentHeight()),
                                          Bitmap.Config.ARGB_8888);
      Canvas  bmcanvas = new Canvas(newBM);
      // Clear background to white
      bmcanvas.drawRGB(255, 255, 255);
      // Render our document onto our canvas
      svg.renderToCanvas(bmcanvas);
   }
Jedoch verstehe ich die Logik dahinter nicht und habe trotz zahlreicher Versuche nichts funktionsfähiges bekommen.
Denn ich verstehe nicht, wo jetzt meine Bitmap ist. Es handelt sich wohl um die "newBM", aber laut meinem Kentnissen erstellt diese Zeile:
Code:
Bitmap  newBM = Bitmap.createBitmap(Math.ceil(svg.getDocumentWidth()),
                                          Math.ceil(svg.getDocumentHeight()),
                                          Bitmap.Config.ARGB_8888);
doch lediglich eine Bitmap mit den Maßen der svg, ohne jeglichen grafischen Inhalt, oder liege ich da falsch?

Was ich ebenfalls nicht verstehe ist der Canvas:
Code:
Canvas  bmcanvas = new Canvas(newBM);
Nach dem was ich gelernt habe, habe ich immer nur einen Canvas benutzt und auf diesem alles malen lassen. Hier bekommt de rCanvas beim initialisieren aber schon eine Grafik. Am Ende wird dann schließlich doch einfach die svg-render methode Verwendet, wodurch ich dann doch keine Bitmap habe und meine Effekte (z.B. Alpha runterschrauben für Durchsichtigkeit) dann immer noch nicht möglich sind.

Oder wird durch die Render Methode jetzt der Grafische Inhalt in die Bitmap übertragen? Aber ich dachte der Canvas malt immer auf den Bildschirm, das zerstört schon wieder meine ursprüngliche Vorstellung eines Canvas :(

Irgendwie kann ich dem code überhaupt nicht folgen und weiß daher nicht wie ich die BM richtig verwenden soll. Ich köntne zwar jetzt alle SVG in Inkscape laden und als Bitmap exportieren, aber das wäre auch sehr aufwendig :/

Bin für jede Hilfe also sehr dankbar!
 
ui_3k1

ui_3k1

Gesperrt
Hallo, ich habe zwar keine Erfahung mit SVGs, aber meines Wissens ist die Darstellung von Effekten auf einem Canvas doch sehr eingeschränkt. Hierfür eignet sich OpenGL besser - ist aber wohl auch schwieriger zu lernen.

Dass newBMP nur die Abmessungen erhält, sehe ich ebenfalls so.

https://code.google.com/p/androidsvg/wiki/APISummary11
-> dort steht ziemlich mittig, was die drawToCanvas-Funktion macht...
The other way to render the SVG is directly to a Canvas. If you are just needing to render the document once, this is the way you will probably want to do it.

Der Canvas ist hier super ausführlich und auch recht gut verständlich erklärt:
Drawing and Drawables in Android Canvas | Packt Publishing


Großartig helfen konnte ich jetzt nicht, aber mich würde mal interessieren wo du den Code her hast. Irgendwo muss ja noch was dazu stehen.
 
T

TM_

Neues Mitglied
Es mag zwar eingeschränkt sein, aber es ist trotzdem alles möglich was ich so bisher brauche. Hiergibt es übrigens viele Anleitungen zu Bitmap Effekten:
Tutorials | [ Android Newbie ]

Vieleicht schaue ich mir wirklich mal ein paar OpenGL Tutorials an, dachte bisher das wäre nicht nötig, aber vielleicht finde ich ja auch ein paar interessante Funktionen heraus, welche ich bisher nicht umsetzen konnte :)

Das Rendern auf den Canvas war kein Problem. Mein Spiel läuft und wie ich den Canvas Transformieren muss um die Grafiken in jedem Winkel und an jeder Position anzuzeigen habe ich auch shcon herausgefunden. Nur mit SVGs kann ich halt keine grafischen Effekte darstellen. Außedem scheinen SVGs die performance negativ zu beeinflussen, da meine Grafiken Gradients (Farbverläufe) nutzen und auch auf Stack Overflow wurde mir gesagt, als ich auch dise Frage getellt habe, dass ich für Spiele die SVGs lieber vorher zu Bitmaps pre-rendern sollte, damit es später flüssiger läuft. Das sollte ich dann so machen, wir auf der Homepage der SVG-library beschrieben war, und das habe ich auch gemacht. Hier ist die Homepage:
https://code.google.com/p/androidsvg/

Den Link mit dem Canvas werd ich mir mal genauer anschauen. Aber mir bleibt wohl doch nichts anderes übrig, als alle Grafiken nochmal in Inkscape zu laden und als Bitmap zu exportieren. Mit Bitmap editoren kann halt überhaupt nicht arbeiten und mit Vektor-Editoren ist es viel leichter Grafiken anzupassen und so schnell Animationen zu erschaffen. Aber naja, komm ich wohl nicht drum rum. Trotzdem danke!