Дизайн Вадим Скворцов
3 336

Дизайн и анимации на основе кода: создаём прототипы во Framer

Руководство по эффективному применению инструмента.

В закладки

Конспект переводчика Николая Геллара.

Framer — это программа для прототипирования и дизайна, основанная на коде. В статье мы рассмотрим основные концепции удобного прототипирования для дизайнеров и разработчиков. И попробуем воспроизвести один из переходов, найденных в приложении Design+Code.

Скачайте файлы проекта, чтобы следовать этому руководству. Для начала работы нужно открыть файл DesignCode-Chapter-New.framer, либо смотрите уже готовое решение.

Интерфейс Framer

У Framer знакомый интерфейс, похожий на многие дизайн-приложения, к которым мы привыкли. По умолчанию новый проект откроется в дизайн-режиме, но можно работать независимо или комбинировать его с режимом кода.

Вкладка «Дизайн»

Может быть разбита на четыре основные части.

1.Боковая панель

Здесь у нас есть инструменты для создания артбордов, прямоугольников, овалов, текста, масштабирования рабочей области, а внизу — встроенная панель иконок.

2. Панель слоёв

Как и большинство других инструментов проектирования, Framer имеет панель слоёв. Однако есть некоторые ключевые отличия. Рассмотрим их более подробно позже, чтобы понять, как работают слои во Framer.

3. Рабочая область

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

4. Панель свойств

При выборе слоя на артборде появляется список доступных свойств для стилизации макета.

Вкладка «Код»

Может быть разделена на пять частей.

1. Боковая панель

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

2. Панель слоёв

Она показывает все слои так же, как в режиме дизайна. При наведении курсора на какой-либо из слоёв на панели можно легко идентифицировать его в окне предварительного просмотра. Если щёлкнуть правой кнопкой мыши по любому из слоёв, появятся функции: добавить анимацию, состояние или событие.

3. Редактора кода

С помощью Framer легко начать кодить. Он имеет привлекательную и полезную подсветку синтаксиса, нижняя часть области редактора зарезервирована для отображения ошибок, которые есть в коде. Ещё есть полезная функция — Smart Autocomplete (понимает код и даёт подсказки с учётом контекста).

4. Окно предварительного просмотра

Это область с отображением прототипа, которая даёт визуальный фидбек в реальном времени.

С верхней части панели навигации можно выбрать различные типы устройств и отсоединить окно предварительного просмотра.

5. Панель свойств

Чтобы получить к ней доступ, нужно щёлкнуть на значок редактирования. На этой панели — различные свойства анимации, состояния или события.

Во Framer есть функция Auto-code, которая сохраняет код с визуальными изменениями. Если изменить слой из окна предварительного просмотра, появятся изменения ещё в двух местах: на панели свойств и в области редактора кода.

Основы дизайна

Основные сведения о Framer.

Слои

Слои во Framer похожи на слои в любом другом инструменте проектирования, но есть несколько небольших различий. Все привыкли к концепции группировки в Sketch: выбираем два или более слоёв и создаём с ними группу.

Технически во Framer нет групп. Вместо этого слои «вложены», как div в веб-странице. Взгляните на артборд Page2. Он имеет несколько дочерних слоёв. iOSGuide находится в верхней части этого дерева и сам содержит несколько дочерних слоёв. iOSGuideImage содержит заголовок и основной текст.

Эти текстовые слои вложены, и хотя они отображаются на панели слоёв ниже iOSGuideImage, они находятся над изображением и всё ещё видны на холсте.

Выделение

Нужно активировать слои, чтобы использовать их в режиме кода. Уровни, активированные в режиме дизайна, подсвечиваются. Чтобы активировать слой, нужно щёлкнуть по маленькой иконке рядом с ним.

Адаптивный макет

Одна из мощных функций Framers — это адаптивность по умолчанию. В зависимости от того, где и как размещены слои на артбордах, Framer всегда будет пытаться определить желания пользователя, как реагировать инструменту на изменения размера экрана. Например, если поместить слой, привязанный к правой стороне экрана, при изменении размера экрана слой останется привязанным к этой позиции.

Предварительный просмотр ресайза

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

Что удивительно, в инструменте ресайза Framer есть функция предварительного просмотра. Можно посмотреть, как слой будет вести себя с выбранными настройками.

Основы кода

Основные понятия прототипирования во Framer можно разбить на четыре части. Они просты, и их освоение приведёт пользователя на следующий уровень прототипирования.

1. Слои

Слои во Framer не похожи на слои в Sketch. При создании их можно стилизировать и добавлять изображения, тексты и видео. Один слой может разделяться на несколько слоёв, есть функция анимации. Это строительные блоки Framer.

2. Анимация

Анимация — это то, что оживляет слои. Можно анимировать свойства слоя: цвет фона, высоту, ширину, размер, непрозрачность, радиус рамки и так далее.

3. Состояния

В состояниях хранятся наборы свойств слоя. Можно создавать несколько состояний и переключаться между ними или анимировать их.

4. События

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

Реализация

Для этого примера будем работать только на вкладке «Код». На вкладке «Дизайн» уже добавлены проекты и выбраны все слои, которые будут использованы в работе. В примере мы будем повторять анимацию, когда при нажатии на одну из карточек разделов эта карточка разворачивается, показывая содержимое раздела. А затем мы будем анимировать закрытие карточки.

Первая часть кода будет сосредоточена на настройке различных элементов на артборде, но в частях «Переход 1» (открытие события) и «Переход 2» (закрытие события) мы будем работать над сворачиванием и разворачиванием анимаций соответственно.

Настройка

Перед переходом к весёлой части зададим настройки для урока.

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

И, наконец, мы зададим состояния по умолчанию для кнопок «Play» и «Close».

Вынесем за пределы холста кнопку «Close», затем уменьшим кнопку «Play» до .5 и зададим непрозрачность 0.

Выделим весь этот код, щёлкнем правой кнопкой мыши и выберем «Fold». Вот где функция Framer «Code Fold» действительно проявляет себя. Это создаст новый раздел для этого кода.

Хорошо держать его в стороне от основного кода, чтобы он был чистым.

Компонент страницы (PageComponent)

Чтобы добавить пейджинг в карточки, нужно использовать PageComponent.

Сделаем его дочерним слоем PageView, который является слоем из артборда Chapters. Затем устанавливаем положение Y. Поскольку у PageComponent теперь есть PageView как родительский слой, любые значения позиции, которые он задаёт, относятся к его родительскому объекту.

Когда мы устанавливаем Y-позицию на 60, то на самом деле мы делаем отступ 60px вниз от верхней части слоя PageView. Чтобы компенсировать это позиционирование, мы установили высоту PageComponent с простым вычислением. Это быстрый способ установить значение свойства слоя, если вы не хотите устанавливать его вручную.

Поскольку этот PageComponent должен прокручиваться только по горизонтали, мы установили scrollVertical в значение «false». Установка contentInset дает страницам некоторый запас слева и справа. Не стесняйтесь играть с некоторыми из этих значений, чтобы увидеть, как они меняют макет.

Теперь PageComponent настроен, но ему нужен контент. Для этого добавим страницы в PageComponent.

pageComp.addPage(Page1)
pageComp.addPage(Page2)

Код внутри скобок — это слой или артборд, который мы хотим установить в качестве содержимого этой страницы.

Настройки состояний

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

Здесь у нас есть два состояния «Show» и «Hide». Думайте о состояниях как способе хранения свойств, между которыми мы можем переключаться. Мы также добавили опции анимации, чтобы получить хороший переход между этими двумя состояниями, контролируемыми spring-кривой, которую мы создали ранее. Давайте сделаем то же самое с кнопкой «Close».

Затем сохраним некоторые свойства по умолчанию из iOS Guide, которые потребуется использовать позже.

Подобно тому, что мы сделали с кнопками «Play» и «Close» выше, создадим состояния для iOSGuide и изображения внутри него.

Добавление текста

Окончательный момент настройки до того, как мы начнём кодить переходы, заключается в добавлении дополнительного контента в iOSGuide, как показано в примере. TextLayer от Framer упрощает это.

Переход 1 (открытие события)

Мы хотим, чтобы переход начался при нажатии iOSGuide. Для этого используем событие onTap.

iOSGuide.onTap ->

Когда это произойдет, удалим его из PageComponent и parent на экране Chapters. Когда событие расширяется, оно не обрезается своим родительским слоем и появляется выше всего остального.

Установка слоя iOSGuide по умолчанию родительским для нового слоя в событии изменит его положение на экране, но мы хотим, чтобы переход начинался с того же места, в котором он находился внутри PageComponent.

Чтобы сделать это, используем одно из свойств iOSGuide, сохранённое ранее, — «screenFrame». Во Framer это свойство получает точное положение и размер элемента на экране.

this.parent = Chapters
this.screenFrame = origPos

Пока будем использовать «this».

Затем изменим внешний вид строки состояния и поместим под ней iOSGuide. Это необязательно, но при разработке для iOS хорошей практикой является использование как светлых, так и тёмных версий строки состояния, поэтому при изменении контекста, в котором он отображается, всегда есть хороший контраст.

StatusLight.visible = true
StatusDark.visible = false
this.placeBehind(StatusLight)

Используем ранее установленные нами состояния и анимируем iOSGuide и iOSGuideImage для этих состояний.

this.animate("Open")
iOSGuideImage.animate("Expanded")

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

Теперь у нас должен быть переход между экранами. Сейчас нет способа отменить это. Нужно показать кнопки «Close» и «Play». Чтобы сделать это, снова будем использовать animate () и перейдём в состояние «Show» для каждого состояния, чтобы оживить их. Мы также разместим их над iOSGuide, чтобы убедиться, что они видны.

closeBtn.animate("Show")
closeBtn.placeBefore(iOSGuide)
playBtn.animate("Show")
playBtn.placeBefore(iOSGuide)

Переход 2 (закрытие события)

Нужен способ закрыть экран статьи и вернуться к главам (Chapters). Для этого добавим к кнопке закрытия событие «onTap» и вернём компоненты обратно в их начальные состояния.

Последнее, что нужно сделать — вернуть iOSGuide в PageComponent, когда заканчивается анимация закрытия. Для этого установим текущее состояние iOSGuide «Close». Мы собираемся проверить, когда прекратит анимацию onAnimationEnd, но не хотим возвращать её обратно в PageComponent, когда заканчивается анимация открытия.

Мы использовали оператор «if», чтобы проверить, является ли текущее состояние iOSGuide «Close», и если да, сделать что-нибудь. В этом случае — вернуть её в Page1 в PageComponent и установить её свойства X и Y обратно в начальные значения внутри Page1, которые мы сохранили в origX и origY ранее в прототипе.

Теперь можно нажать на карточку: она открывается, а после нажатия на кнопку закрытия сворачивается. К прототипу можно добавить рамку iPhone X.

#дизайн #инструменты

{ "author_name": "Вадим Скворцов", "author_type": "editor", "tags": ["\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b","\u0434\u0438\u0437\u0430\u0439\u043d"], "comments": 13, "likes": 19, "favorites": 53, "is_advertisement": false, "subsite_label": "design", "id": 34499, "is_wide": false, "is_ugc": false, "date": "Tue, 13 Mar 2018 10:49:17 +0300" }
{ "id": 34499, "author_id": 120027, "diff_limit": 1000, "urls": {"diff":"\/comments\/34499\/get","add":"\/comments\/34499\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/34499"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199114, "possessions": [] }

13 комментариев 13 комм.

Популярные

По порядку

Написать комментарий...
1

Зачем кодить на этом, если можно кодить напрямую?
Возможно код проще, но тогда проще делать в других программах прототипы.

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

Ответить
1

Прикол фреймера еще в том, что можно создавать промо-ролики будущего продукта, не нанимая мобильного разработчика, не делая демку, не выдрачивая анимации в After Effects.

Еще можно показать клиенту свои задумки, и, после утверждения, отдать в разработку.

А так же можно сделать что-то красивое, и выложить гифку на dribbble.

На самом деле, юзкейсов оч много.

Ответить
0

А что из этого нельзя сделать в Principle?

Ответить
0

Framer более хардкорный, там можно программировать логику приложения.
Principle, как я понял, почти тоже самое, только более юзер-френдли?

Ответить

1

К слову, мы ищем Ui/Ux к себе в DOC+. Отличную коммуникацию между всеми отделами гарантируем) Пишите на grant.petrosyan@doclus.ru

Ответить

0

Верно, опечаточка)

Ответить

0

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

А идеальные коммуникации не нужны, нужны здоровые. В топ 5 компаний я думаю все отлично.

Ответить

0

Не понял, причем здесь топ-5 компаний? В топах работает 0,0001% населения - остальным туда же рваться что ли?

Боже мой, ты спросил где идеальные коммуникации, и получил на это ответ, причем тут рваться или нет? Следишь за разговором?

Какой продукт позволяет делать прототип, дизайн, анимацию, переходы между экранами

Principle, Invision studio (скоро выйдет), Sketch + Diya

поддерживает сторонний код и код вообще

А это то тут причем? Сторонний код поддерживает любая IDE, писать можешь на вебтехнологиях, тот же фреймер.

не является монструозной IDE

Ты можешь кодить и не в IDE, хоть в блокноте, который не отпугнет никого.

которая сразу 99% дизайнеров отпугнёт?

Не поверишь, не все дизайнеры не умеют кодить

Ответить
0

Зачем столько усилий при подготовке прототипа? К чему все эти анимации и рюшечки? Суть прототипирования в том, чтобы сделать это максимально быстро. А это уже похоже больше на реализацию самого приложения.

Ответить

0

Вот все пишут "чтобы показать клиенту или разработке" но для этого есть наипростейший Principle, который еще никто не уделал.

Кто нибудь может внятно объяснить зачем связываться с приложениями типа Framer, Origami Studio и тд для прототипов если там все сложнее и дольше чем в Principle?

Я знаю только 1 плюс – возможность делать "реальные" текстовые поля. Но зачем они в прототипе?

Ответить

0

Хах, сколько существует фронтенд, он только усложняется и усложняется.

Ответить

0

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

Ответить

0

вы не совсем в теме, судя по всему.

Ответить

0
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Компания отказалась от email
в пользу общения при помощи мемов
Подписаться на push-уведомления
{ "page_type": "default" }