Erstellen Sie 2 morphbare SVGs

Ich versuche, 2 SVGs zu erstellen, die voneinander gemorpht werden können, um sie in einer Android-App zu verwenden.

Allerdings sind die Anforderungen ziemlich streng: Die 2 SVGs (von und nach) müssen die gleiche Anzahl von Anweisungen und die gleichen Arten von Knoten in der gleichen Reihenfolge haben, dh wenn Pfad 1 verschoben wird, dann Linie, dann muss Pfad 2 verschoben werden dann auch Zeile, sonst stürzt die App ab.

Gibt es ein Tool, um dies zu erreichen?

Bisher bin ich nur auf visuelle Tools gestoßen, die keine Kontrolle darüber geben, wie der exportierte Pfad aussehen wird, und nichts, mit dem zwei SVGs übereinstimmen können.

Ich bin mir nicht sicher, ob es dafür ein spezielles Tool gibt. Wie kompliziert sind die SVGs?
Ist dies auch eine integrierte Android-Funktion oder ein Drittanbieter-Framework? Könntest du die Dokumentation verlinken?
Hier ist das Dokument zu diesem Thema: developer.android.com/reference/android/graphics/drawable/… nicht viel zu tun
Dies ist eine integrierte Android-Funktion
The SVGs are relatively complex : here is the longest of the 2s : M4,0.992786407 C4,0.444485615 4.45303631,0 4.99703014,0 L11.0029699,0 C11.5536144,0 12,0.452362061 12,0.992786407 L12,31.0072136 C12,31.5555144 11.5469637, 32 11.0029699,32 L4.99703014,32 C4.4463856,32 4,31.5476379 4,31.0072136 L4,0.992786407 L4,0.992786407 Z M20,0.992786407 C20,0.444485615 20.4530363,0 20.9970301,0 L27.0029699,0 C27.5536144,0 28 ,0.452362061 28,0.992786407 L28,31.0072136 C28,31.5555144 27.5469637,32 27.0029699,32 L20.9970301,32 C20.4463856,32 20,31.5476379 20,31.0072136 L20,0.992786407 L20,0.992786407 Z
Ok, das habe ich gelesen, ich kann nirgendwo sehen, dass die Befehle gleich sein müssen, nur dass es die gleiche Anzahl von Befehlen braucht.
Das ist nicht kompliziert ;) Ich bezweifle sehr, dass Sie so viele Dezimalstellen in Ihren Koordinaten benötigen
Ich habe mir die Quelle des Parsers angesehen, um seine Einschränkungen zu kennen: androidxref.com/6.0.1_r10/xref/frameworks/base/core/java/…
Ja, ich brauche nicht so viele Dezimalstellen. Sicher, es ist kein Tausend-Knoten-Svg, aber es ist schon lang genug, um es zu einer entmutigenden Aufgabe zu machen, es von Hand zu bearbeiten, zumal die Ursprungs- und Zielformen sehr unterschiedlich sind.
Sie könnten Ihren eigenen Exporter schreiben, es ist nicht sehr schwer
Du könntest @joojaa :p

Antworten (2)

Das Erstellen Ihres eigenen begrenzten Exporters sollte ziemlich einfach sein, wenn Sie wissen, wie Sie jede Form und jeden Scheitelpunkt loopen. Jetzt kann ich Ihnen persönlich nicht mit Sketch oder Affinity Editor helfen, da ich beides nicht habe. Aber das ist ziemlich trivial in Illustrator.

Auf der anderen Seite beheben einige Tools wie MorphSVG diese Dinge automatisch für Sie. Obwohl ich verstehe, dass manchmal die genaue Kontrolle, genau die gewünschten Punkte zu haben, ein Geschenk des Himmels ist, um die Details so zu steuern, wie Sie es beabsichtigt haben.

Randnotiz : Wenn ich versuche, dies zu illustrieren, sind die Codes stabil, aber wenn Sie eine harte bis nicht harte/glatte Interpolation durchführen müssen, funktioniert es auch hier nicht.

Geben Sie hier die Bildbeschreibung ein

Bild 1 : Einfache Demo , klicken Sie auf den Link für Live im Browser. Pfade mit dem folgenden Code erstellt.

Hier ist also eine Version, die ständig C (absolute Kurve) zwischen jedem Pfadsegment für den Illustrator verwendet, um Probleme mit dem Ändern von Punkttypen zu vermeiden. Es verwendet sogar Bezier-Pfade für gerade Segmente. Sie können dies als Gerüst für die Entwicklung Ihrer eigenen verwenden.

// jooExportSVGScaffold.jsx
// run in extendscript toolkit or put in a file with .jsx 
// extension and drag and drop on illustrator.
//
// files saves a a4 output with only curve to segments of paths so they 
// always stay the same when exported so it can easily be interpolated   
// later.

#target illustrator

main();

function ppos(point){
    return ""+point[0]+" "+-1*point[1] 
}


function handlePath(path) {
    var out = "";    
    var pnts = path.pathPoints;

    var ipos = pnts[0].anchor;

    var pos = pnts[0].rightDirection;
    var pos2, pos3;
    out="M"+ppos(ipos);
    for (var p=1; p<pnts.length; p++){
       pos2 = pnts[p].leftDirection;
       pos3 = pnts[p].anchor;
       out += "C"+ppos(pos)+" "+ppos(pos2)+" "+ppos(pos3);
       pos = pnts[p].rightDirection;
    }
    if (path.closed){
        pos2 = pnts[0].leftDirection;
        pos3 = pnts[0].anchor;
        out += "C"+ppos(pos)+" "+ppos(pos2)+" "+ppos(pos3)+"Z";
    }
    return out;
}

function main() {
    var sel = app.activeDocument.selection; 
    var file = File.saveDialog('save centers', 'SVGPath:*.svg');

    file.open('w');

    file.writeln('<?xml version="1.0" encoding="utf-8"?>');
    file.writeln('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">');
    file.writeln('<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"');
    file.writeln('width="595.28px" height="841.89px" viewBox="0 0 595.28 841.89" enable-background="new 0 0 595.28 841.89" xml:space="preserve">');


    var doc = app.activeDocument;
    var paths = doc.pathItems;

    for (var i=0; i<paths.length; i++){
        data=handlePath(paths[i]);  
        file.writeln('<path fill="none" stroke="black" d="'+data+'"/>');
    }
    file.writeln('</svg>'); 
    file.close();
}

Hier ist eine Demo-Animation , die mit dieser Methode erstellt wurde, Pfadwerte aus dem exportierten SVG, das mit meinem Skript erstellt wurde. Dieser Effekt ist für den Standardexporter besonders schwer zu erreichen.

PS: Es ist auch möglich, ein SVG korrekt in nur C-Spans zu posten. Es ist etwas komplizierter, aber nicht unmöglich, ein S in ein C und ein L in ein C zu verwandeln usw.

Ich kenne kein bestimmtes Tool, das Ihnen helfen wird, aber vorausgesetzt, die SVGs sind nicht übermäßig komplex, würde ich einfach das zweite erstellen, indem ich das erste manuell bearbeite.

Erstellen Sie Ihr erstes SVG und speichern Sie es. Duplizieren Sie die Datei. Öffnen und erstellen Sie Ihr zweites SVG, indem Sie nur vorhandene Ankerpunkte bearbeiten.

Solange Sie keine weiteren Formen oder Ankerpunkte hinzufügen, sollte die Anzahl der Befehle in Ihren Pfaden gleich bleiben.

Sie können Ihre SVGs jederzeit in einem Texteditor öffnen, um zu bestätigen, dass sie die gleiche Anzahl von Attributen, Pfadbefehlen usw. haben.

Das war mein erster Impuls. In Sketch oder Affinity reicht jedoch bereits das Verschieben eines Ankerpunkts aus, um ein inkompatibles SVG zu erzeugen.
wie ist es inkompatibel?
@Cai ist einfacher zu interpolieren, wenn der Pfad die gleiche Anzahl identischer Knoten hat. Damit die Vertex-Nummerierung und -Typen immer gleich sind.