SVG mit Canvas zeichnen

T

TM_

Neues Mitglied
1
Hallo,
Bitmaps sind zwar leicht einzubinden, aber sie sehen halt noch lange nicht so gut aus wie Vektorgrafiken. Nun habe ich den ganzen Tag versucht Vektorgrafiken im .svg Format auf den Bildschirm zu bringen. Die SVG Library have ich schon im Internet entdeckt und auch eingebaut. Als Beispielcode war zudem das hier angegeben:
Code:
SVG svg = SVGParser.getSVGFromResource(getResources(), R.raw.filename);
Picture picture = svg.getPicture();
Drawable drawable = svg.createPictureDrawable();
Doch das nimmt das Programm nicht an. deshalb habe ich das raw zu drawable geändert.
Code:
SVG svg = SVGParser.getSVGFromResource(getResources(), R.raw.vektor);
So stehts nun bei mir und es gibt so auch keine Fehler in eclipse. Sobald ich die App aber über den Emulator öffne stürzt es ab. Durch zahlreiche Versuche wo ich jedes mal vorm testen etwas auskommentiert habe bin ich mir nun auch zu 100% sicher, dass es daran liegt. Die datei "vektor.svg" liegt im Verzeichnis res>drawable-hdpi gleich neben der ic-launcher.png.

Zudem kommt noch das Problem: Wenn es das Bild endlich mal zeichnet ohne abzustürzen, wie bestimme ich die Position wo gemalt werden soll? Bei Bitmap konnte ich das ja über den zweiten und dritten Parameter regeln, beim picture gibt es keine weiteren die das tun könnten.

Schon mal Danke im vorraus und entschuldigung, wenn die Antwort doch sehr simpel ist und ich einfach nur zu blöd bin ^^
 
Stürzt ab = Log Cat Ausgabe ... wie lautet die denn ?

----

Falls es an den SVG liegen sollte, die Lib wo du das Beispiel oben her hast ist ja schon 2 Jahre alt. -> eventl mal eine neuere Library probieren

https://code.google.com/p/androidsvg/
 
Zuletzt bearbeitet:
killphil75 schrieb:
Falls es an den SVG liegen sollte, die Lib wo du das Beispiel oben her hast ist ja schon 2 Jahre alt. -> eventl mal eine neuere Library probieren

https://code.google.com/p/androidsvg/

Jo lag daran, vielen Dank! Hab den Code überarbeitet und beim SVG an sich stürzt es nun nicht mehr ab. Erst wenn ich die Methode zum Rendern drinlasse stürzt es ab, das Erstellen der Sprites und dessen Aufruf der onDraw-Methode lösen keine Fehler aus.

Hier nochmal das wichtigste vom Code:
Thread-Klasse (die onDraw-Methode und der Canvas sind hier das wichtigste, die Thread-Klasse an sich sollte aber nicht das Problem sein)
Code:
@SuppressLint("WrongCall") @Override
    public void run() {
        long TPS = 1000 / FPS;
        long startTime;
        long sleepTime;
        
        while (isRunning) {
            Canvas theCanvas = null;
            startTime = System.currentTimeMillis();
            try {
                theCanvas = theView.getHolder().lockCanvas();
                synchronized (theView.getHolder()) {
                    theView.onDraw(theCanvas);
                }
            } finally {
                if (theCanvas != null) {
                    theView.getHolder().unlockCanvasAndPost(theCanvas);
                }
            }
            sleepTime = TPS - (System.currentTimeMillis() - startTime);
            try {
                if (sleepTime > 0)
                    sleep(sleepTime);
            } catch (Exception e) {
 
            }
        }
    }
GameView-Klasse wichtiger Teil
Code:
@SuppressLint("WrongCall")
    public void onDraw(Canvas pCanvas){
        if (creatingSprites){
            createSprites();
            creatingSprites = false;
        }
        pCanvas.drawColor(Color.DKGRAY);
        for (ScratchSprite sprite : spriteList) {
            sprite.onDraw(pCanvas);
        }
    }
    
    public void createSprites(){
        createSprite("Sprite1", "vektor");
    }
    
    public void createSprite(String pName, String pSvg){
            try {
                svg = SVG.getFromAsset(getContext().getAssets(), pSvg);
            } catch (SVGParseException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        
        ScratchSprite sprite = new ScratchSprite(this, pName, svg);
        spriteList.add(sprite);
    }
Sprite Klasse onDraw
Code:
public void onDraw(Canvas pCanvas){
        
            svg.renderToCanvas(pCanvas); 
    }
Und was die Log-Cat sagt fall ich svg.renderToCanvas(pCanvas); nicht auskommentiere.

Code:
07-02 17:31:21.420: I/Choreographer(893): Skipped 59 frames!  The application may be doing too much work on its main thread.
07-02 17:31:21.490: D/gralloc_goldfish(893): Emulator without GPU emulation detected.
07-02 17:31:21.500: W/System.err(893): java.io.FileNotFoundException: vektor
07-02 17:31:21.500: W/System.err(893):     at android.content.res.AssetManager.openAsset(Native Method)
07-02 17:31:21.500: W/System.err(893):     at android.content.res.AssetManager.open(AssetManager.java:316)
07-02 17:31:21.500: W/System.err(893):     at android.content.res.AssetManager.open(AssetManager.java:290)
07-02 17:31:21.510: W/System.err(893):     at com.caverock.androidsvg.SVG.getFromAsset(SVG.java:203)
07-02 17:31:21.510: W/System.err(893):     at net.tmScratcher.gameframework.GameView.createSprite(GameView.java:92)
07-02 17:31:21.510: W/System.err(893):     at net.tmScratcher.gameframework.GameView.createSprites(GameView.java:87)
07-02 17:31:21.510: W/System.err(893):     at net.tmScratcher.gameframework.GameView.onDraw(GameView.java:77)
07-02 17:31:21.510: W/System.err(893):     at net.tmScratcher.gameframework.GameLoopThread.run(GameLoopThread.java:31)
07-02 17:31:21.560: W/dalvikvm(893): threadid=11: thread exiting with uncaught exception (group=0xb2ac1ba8)
07-02 17:31:21.560: E/AndroidRuntime(893): FATAL EXCEPTION: Thread-51
07-02 17:31:21.560: E/AndroidRuntime(893): Process: net.tmScratcher.gameframework, PID: 893
07-02 17:31:21.560: E/AndroidRuntime(893): java.lang.NullPointerException
07-02 17:31:21.560: E/AndroidRuntime(893):     at net.tmScratcher.gameframework.ScratchSprite.onDraw(ScratchSprite.java:71)
07-02 17:31:21.560: E/AndroidRuntime(893):     at net.tmScratcher.gameframework.GameView.onDraw(GameView.java:82)
07-02 17:31:21.560: E/AndroidRuntime(893):     at net.tmScratcher.gameframework.GameLoopThread.run(GameLoopThread.java:31)
07-02 17:31:25.940: I/Process(893): Sending signal. PID: 893 SIG: 9
rot wirds in der zeile mit fatal error, hört sich auch nicht so gut an ^^
Nur wie ich den Fehler beheben kann weiß ich leider nicht :/

EDIT: Habe festgestellt, dass svg im Sprite null ist, muss nun nur herausfinden wieso ...
 
Zuletzt bearbeitet:
Hmm was mir da oben ins Auge fällt, ist das FileNotFound. Wenn du in einem Extrathread das öffnen und Zeichnen erledigst, muss du mal schauen ob du den Context richtig mit schleifst (parameter oder per getApplicationcontext). Eventl hat er da probleme mit dem Zugriff auf den AssetsManager.
 
So habs nun endlich geschafft :thumbsup:
An dem Context lags nicht oder ich habs zumindest nicht damit gelöst bekommen. Ich habe einfach mal die Datei aus den Resources anstatt aus dem Asset genommen und es hat funktioniert :) Ich weiß zwar immer noch nicht, warum die svg = null ist falls ich den Asset verwende, aber solange das workaround benutzen kann und es keine sichtaberen Nachteile hat ist ja alles okay :)
Und nochmals vielen Dank! Ohne dich säß ich wahrscheinlich immer noch an der alten Version von SVG und wär nie zu etwas gekommen :D

Jetzt aber nochmal zu der zweiten Frage aus dem ersten Post:
Bild auf den Bildschirm bringen funktioniert, dochwie ist es mit Bild bewegen? Beim Malen von Bitmaps gibt's ja 4 Parameter, der erste die Bitmap selbst, die nächsten 2 sind die Position. Doch bei SVGs gibts sowas nicht. Ne passende Canvasmethode habe ich leider auch noch nicht gefunden. Was wäre denn die praktischte bzw kürzeste Möglichkeit eine SVG an einer neuen Position zu rendern? Momentan ist es immer 0, 0
 
Zuletzt bearbeitet:
Ah habs nun endlich gefunden. Die Position lässt sich mithilfe dieser Methode bestimmen:
canvas.translate(x, y);

Jetzt ist alles geklärt, nochmal vielen Dank!
Thema kann nun geschlossen werden ;)
 

Ähnliche Themen

B
Antworten
4
Aufrufe
528
bb321
B
FabianDev
Antworten
5
Aufrufe
582
swa00
swa00
MES
Antworten
10
Aufrufe
848
MES
MES
Zurück
Oben Unten