В мире апплетов функция генерации картинок и обмена ими в кругу друзей настолько ослепительна, что каждый апплет спешит встать на колени под ее гранатовой юбкой. К сожалению, WeChat Dad не предоставил нам очень хороших и удобных сопутствующих инструментов, наоборот, функцию захвата экрана жестоко выкинули на помойку истории, оставив только компонент Canvas и пропасть вокруг него.
Поэтому мы подготовили набор инструментов под названием Painter, чтобы предоставить разработчикам простое и практичное решение для «рисования» изображений, чтобы разработчики могли свободно создавать файлы изображений, которые они хотят.
Портал на гитхабе:GitHub.com/Ku добавил -моб…
Если вы используете холст непосредственно для рисования, это, безусловно, очень неприятный опыт.Помимо неконтролируемого кода, есть бесчисленные провалы. Давайте сначала перечислим ямы, на которые наступили в холсте, и наше решение (или обход).
Яма холста
С точки зрения реализации, художник использует холст апплета в качестве носителя для достижения вышеуказанных функций. И у холста много знаменитых ям. Какие-то ямы мы обходили осторожно, какие-то ямы все-таки ступали одной ногой...
- В некоторых моделях iOS WeChat версии 6.6.6 метод холста clip() не может быть восстановлен. В результате на этих моделях невозможно выполнить операцию скругления углов. У нас не было другого выбора, кроме как отказаться от этих моделей во время разработки, и мы использовали оператор if, чтобы кастрировать функцию округления этих машин. . .
- Холст апплета предоставляет метод MeasureText(), который временно поддерживает только измерение ширины текста и не может знать конкретную высоту текста. Поэтому некоторые требования к выравниванию элементов невозможно выполнить красиво.
- При рисовании картины есть шанс, что произойдет очень волшебное действие, то есть общее положение холста при рисовании отклонится, в результате чего итоговая сгенерированная картинка будет неполной. Это происходит в большинстве случаев, когда рисовальщик вызывается в onLoad. Мы справляемся с этим, определяя соотношение ширины и высоты изображения и перерисовывая его, как только возникает аномалия.
- Canvas не может рисовать сетевые изображения. Метод canvas.drawImage(url), который передает сетевую ссылку на URL-адрес, отлично работает на симуляторе, но не может быть отрисован на реальной машине. Мы внедрили набор собственного механизма отрисовки сетевых картинок после загрузки в Painter, а также добавили в него механизм управления хранилищем LRU.
- Canvas — это нативный компонент, который всегда находится в верхней части представления, и настройка z-index на него не влияет. Не так много, чтобы сказать об этом. . На него должно было наступить много людей.
- Для рисования холста компонент холста должен быть фактически написан на странице, а его wx:if не может быть ложным. Однако допускается размещение компонента холста за пределами экрана, например установка position:fixed;left:750rpx;. Этот метод является черной технологией, которая может решить две проблемы 5 и 6.
Особенности художника
как показано на рисунке
Через правую часть похожую на css и немного похожую на json, но по сути это несколько строчек js кода, слева рисуем график, включающий четыре часто используемых элемента: фоновое изображение, текст, изображение и QR-код. .
После того, как Painter прочитает код и нарисует картинку, он вернет нам ссылку на картинку. На этом этапе мы можем загрузить изображение, сохранить его локально или отобразить на экране.
Он может легко настроить нужные вам изображения, и вы можете свободно и динамично менять стиль изображений.
Кроме того, метод canvas.drawImage() апплета не может рисовать сетевые изображения на реальной машине. И Painter может решить эту проблему, если у вас есть необходимость рисовать сетевые картинки, вы также можете рассмотреть возможность использования Painter.
Другие преимущества Painter
-
Художник может загружать сетевые изображения на локальный компьютер и выполнять управление LRU с сетевым содержимым, загруженным на локальный компьютер. В настоящее время максимальное локальное хранилище, разрешенное апплетом, составляет 10 м. По умолчанию локальное хранилище, которое могут использовать художники, составляет 6 м. Когда оно превышается, локальное хранилище будет очищено. Если вам нужно настроить, вы можете изменить свойство MAX_SPACE_IN_B в /painter/lib/downloader.js.
-
В настоящее время свойства css дочерних представлений поддерживают объект или массив. Позволяет извлекать свойства css, общие для нескольких представлений.
-
Поскольку палитра json поддерживается js, вы можете легко добавить свою собственную логику к каждому атрибуту. Вы также можете извлечь некоторые свойства по отдельности и использовать их в нескольких палитрах для достижения модульности.
использовать
демо скачать
Демонстрационный проект управляется подмодулем, поэтому его нужно запускать при клонировании.
git clone https://github.com/Kujiale-Mobile/Painter.git --recursive
Вы можете увидеть каталог после завершения клонирования. Среди них примеры использования хранятся в /pages/example, а /components/painter — это функциональный компонент, который мы представили. Кроме того, есть каталог палитр, в котором хранится нужный нам код рисования. В реальной работе художник вызовет информацию в card.js и нарисует соответствующую графику на картинке, точно так же, как модулированная кисть и погруженная в краску на палитре, а затем созданная на холсте.
Внедрите Painter в свои собственные проекты
Вы можете напрямую скопировать и вставить рисовальщик из демо в свой собственный проект, и, конечно же, вы можете запустить этот код более элегантно:
git submodule add https://github.com/Kujiale-Mobile/PainterCore.git painter
Это поместит инструмент Painter в ваш текущий каталог. Мы рекомендуем размещать его под вашими компонентами.
импортные компоненты
Как и другие компоненты, добавьте на страницу файл .json, который необходимо импортировать в Painter:
"usingComponents":{
"painter":"/components/painter/painter"
}
вызов компонента
Вызовите компонент рисования в XML-файле страницы и передайте данные правила палитры и обратного вызова после завершения рисования.
<painter palette="{{data}}" bind:imgOK="onImgOK" bind:imgErr="onImgErr"/>
палитра — это данные нашей палитры, созданные в формате json в соответствии с определенными спецификациями.Подробнее см. ниже.
отрисовка обратного вызова
bind:imgOK="onImgOK"
bind:imgErr="onImgErr"
После того, как данные будут переданы, рисовальщик начнет рисовать.Независимо от того, будет ли рисунок успешным или неудачным, соответствующая информация может быть получена в соответствующем методе обратного вызова, например:
Pallette
В конечном счете, Painter — это инструмент-кисть, и нам, талантливым программистам, решать, что именно этой кистью рисовать. Скажите ему, что рисовать, где рисовать, какую позу использовать при рисовании... и т.д. Для этого нужны какие-то другие средства, потому что научные эксперименты доказали, что попытка общаться с ним на языке мандарин не будет иметь никакого эффекта.
Свойства палитры
Каждая палитра имеет свои общие свойства, которые обычно определяют размер, стиль, фон и т. д. всего диапазона рисования.
Он находится в самом внешнем слое всего файла json и должен указать следующие свойства:
Атрибуты | объяснять |
---|---|
background | Фон, который может быть значением цвета или ссылкой на изображение, поддерживает локальные ссылки на изображения и сетевые ссылки на изображения. |
width | ширина |
height | высокий |
borderRadius | закругленные углы |
views | Другие элементы, которые необходимо нарисовать на диаграмме, могут быть пустыми, но не могут быть опущены. |
Образец кода:
{
background: 'https://qhyxpicoss.kujiale.com/2018/06/12/LMPUSDAKAEBKKOASAAAAAAY8_981x600.png',
width: '654rpx',
height: '400rpx',
borderRadius: '20rpx',
views: []
}
просмотреть недвижимость
После рисования общих свойств палитры пришло время добавить некоторые элементы к представлениям. Элемент поддерживает четыре типа, которые классифицируются по полю типа. Различные типы представлений требуют разных данных, например, элемент изображения должен предоставить свой URL-адрес, а текстовый элемент должен предоставить текстовое содержимое:
type | content | description | частная собственность css |
---|---|---|---|
image | url | Адрес ресурса изображения, локальный или сетевой | |
text | text | текстовый элемент, написание текста | fontSize: размер шрифта, цвет: цвет текста |
rect | никто | прямоугольник | цвет: цвет заливки |
qrcode | content | Нарисуйте QR-код | background: цвет фона, по умолчанию прозрачный |
В дополнение к частным свойствам каждого представления, представление имеет некоторые общедоступные свойства, которые можно установить:
Атрибуты | эффект |
---|---|
left, top, right, bottom | положение элемента |
rotate | Угол поворота, в градусах 360 градусов |
borderRadius | Закругленные углы, если вам нужно установить исходную форму изображения, установите для этого свойства половину ширины или высоты. |
align | Выравнивание элементов по горизонтали, используемое совместно с левым, может быть установлено по левому краю, по центру, по правому краю, по умолчанию — по левому краю. |
rotate
Вращение элемента управления, как показано на рисунке ниже, поворачивает строку текста на 6 градусов по часовой стрелке.
{
type: 'text',
text: '酷家乐 移动前端',
css: {
left: '20rpx',
top: '50rpx',
fontSize: '40rpx'
},
},
Эффект:
borderRadius
Код (обведите):
{
type: 'image',
url: this.cardInfo.avatar,
css: {
top: '48rpx',
left: '448rpx',
width: '192rpx',
height: '192rpx',
borderRadius:'96rpx',
},
},
Квадратный угол --> закругленный угол 8rpx --> круглый
align
Интересно значение этого свойства, оно используется для установки выравнивания элемента в горизонтальном направлении относительно настройки положения.
Что это обозначает?
Например, если для левого края элемента установлено значение 100rpx, а для свойства align установлено значение left, то левый конец элемента выравнивается по 100rpx; если для align установлено значение center, центральная ось элемента выравнивается по 100 рпкс.
В следующем примере левая из трех строк текста имеет размер 230 rpx, а выравнивание — по левому краю, по центру и правому краю соответственно. Красная линия — это ось с абсциссой 230 rpx.
То есть, когда установлено свойство align, левое значение выражает позицию align в свойстве элемента.
Код:
{
type: 'text',
text: '酷家乐 移动前端',
css: {
left: '330rpx',
top: '100rpx',
fontSize: '40rpx',
},
},
{
type: 'text',
text: '酷家乐 移动前端',
css: {
left: '330rpx',
top: '200rpx',
fontSize: '40rpx',
align: 'center'
},
},
{
type: 'text',
text: '酷家乐 移动前端',
css: {
left: '330rpx',
top: '300rpx',
fontSize: '40rpx',
align: 'right'
},
},
С помощью этого свойства вы можете установить выравнивание элемента и выполнить следующие требования к макету:
Примечание. Используйте свойство align в сочетании со свойством left. Установка правильного значения вызовет ошибку.
выровнять и повернуть
Когда атрибуты выравнивания и атрибута поворота существуют одновременно, вращение элемента центрируется в центральной точке элемента.
измерительное устройство
В настоящее время Painter поддерживает две единицы измерения размера, px и rpx, которые представляют то же значение, что и в апплете. Использование процентов еще недостаточно хорошо поддерживается.
сохранить демонстрационное изображение
После получения URL-адреса изображения вы можете установить кнопку щелчка и нажать, чтобы сохранить его локально.
onImgOK(e) {
this.imagePath = e.detail.path;
},
saveImage() {
wx.saveImageToPhotosAlbum({
filePath: this.imagePath,
})
},
Кнопка привязана к методу saveImage, нажмите, чтобы сохранить:
Создайте круг друзей, обменивающихся фотографиями
Наконец, с помощью инструмента Painter вы можете генерировать разные стили обмена картинками в кругу друзей (на картинке ниже скриншот онлайн-версии визитной карточки Kuka апплета WeChat)
Эпилог
Painter – это набор инструментов, созданных фронтендом Kujiale для фактической разработки небольших программ. В настоящее время он используется для обмена моментами, замены шаблонов скинов и т. д. Открытый исходный код, чтобы поделиться со всеми. Если это может кому-то помочь, мы очень рады; мы также очень рады и благодарны за упоминание issure или pr, чтобы рассказать нам что-то, о чем мы не можем думать сами, или помочь решить большие и маленькие дыры в Painter:
снова портал:GitHub.com/Ku добавил -моб…