Создайте 2 трансформируемых SVG

Я пытаюсь создать 2 SVG, которые можно преобразовать друг в друга, чтобы использовать их в приложении для Android.

Однако требования довольно строгие: 2 SVG (от и до) должны иметь одинаковое количество инструкций и одинаковые типы узлов в одном и том же порядке, т. е. если путь 1 перемещается, а затем строка, то необходимо перемещать путь 2. затем строку тоже, иначе это приведет к сбою приложения.

Есть ли какой-нибудь инструмент для этого?

До сих пор я сталкивался только с визуальными инструментами, которые не дают никакого контроля над тем, как будет выглядеть экспортированный путь, и ничего не позволяет сопоставлять два SVG.

Я не уверен, что для этого есть какой-то специальный инструмент. Насколько сложны SVG?
Также это встроенная функция Android или сторонняя структура? Не могли бы вы дать ссылку на документацию?
вот документ по этой теме: developer.android.com/reference/android/graphics/drawable/… не так много, чтобы продолжать
Это встроенная функция андроида.
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
Хорошо, это то, что я читал, я нигде не вижу, чтобы команды были одинаковыми, просто нужно одинаковое количество команд.
Это не сложно ;) Я очень сомневаюсь, что вам нужно столько знаков после запятой в ваших координатах
Я взглянул на источник парсера, чтобы узнать его ограничения: androidxref.com/6.0.1_r10/xref/frameworks/base/core/java/…
да, мне не нужно столько десятичных знаков. Конечно, это не тысяча узлов svg, но он уже достаточно длинный, чтобы сделать его ручное редактирование сложной задачей, тем более что исходная и конечная формы сильно различаются.
Вы можете написать свой собственный экспортер, это не очень сложно
Ты мог бы @joojaa :p

Ответы (2)

Создание собственного ограниченного экспортера должно быть довольно простым, если вы знаете, как зациклить каждую фигуру и вершину. Сейчас я лично не могу вам помочь с редактором Sketch или Affinity, так как у меня нет ни того, ни другого. Но это довольно тривиально сделать в иллюстраторе.

С другой стороны, некоторые инструменты, такие как morphSVG , автоматически исправят эти проблемы. Хотя я понимаю, что иногда точный контроль наличия именно тех точек, которые вы хотите, является находкой для контроля деталей, как вы предполагали.

Боковое примечание : когда я пытаюсь использовать иллюстратор, коды стабильны, однако, если вам нужно сделать интерполяцию от жесткой к нежесткой/гладкой, она не будет работать даже здесь.

введите описание изображения здесь

Изображение 1 : Простая демонстрация , щелкните ссылку, чтобы перейти в браузер. Пути, сделанные с кодом ниже.

Итак, вот версия, которая постоянно использует C (абсолютную кривую) между любым сегментом пути для иллюстратора, чтобы избежать проблем с изменением типов точек. Он даже использует пути Безье для прямых сегментов. Вы можете использовать это как основу для разработки своих собственных.

// 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();
}

Вот демонстрационная анимация , сделанная с помощью этого метода, значения пути взяты из экспортированного SVG, созданного с помощью моего скрипта. Этого эффекта особенно трудно добиться экспортеру по умолчанию.

PS: также можно опубликовать правильный SVG только в промежутках C. Немного сложнее, но не невозможно превратить S в C и превратить L в C и т. д.

Я не знаю какого-либо конкретного инструмента, который вам поможет, но если предположить, что SVG не слишком сложны, я бы просто создал второй, отредактировав первый вручную.

Создайте свой первый SVG и сохраните. Дублируйте файл. Откройте и создайте второй SVG, отредактировав только существующие опорные точки.

Пока вы не добавляете больше фигур или опорных точек, количество команд в ваших путях должно оставаться прежним.

Вы всегда можете открыть свои SVG в текстовом редакторе, чтобы убедиться, что они имеют одинаковое количество атрибутов, команд пути и т. д.

Это был мой первый порыв. Однако в Sketch или Affinity даже простого перемещения одной точки привязки уже достаточно, чтобы создать несовместимый SVG.
как это несовместимо?
@Cai легче интерполировать, если путь имеет равное количество идентичных узлов. Так что нумерация и типы вершин всегда одинаковы.