Приготовление иконок
в формате шрифта
1
История начинается
Схема получения иконок для проекта "Эталон"
elusiveicons-webfont.ttf
/cheatsheet
elusiveicons.com
2
1.png
2.png
3.png
3
...
В проекте
4
5
Сюрприз!
6
Проблемы
1)
Сложный процесс преобразования иконок
2)
Много вариаций одной иконки
3)
Полный хаос в структуре ресурсов
7
Проблемы
1)
Сложный процесс преобразования иконок
2)
Много вариаций одной иконки
3)
Полный хаос в структуре ресурсов
Решение?
Есть одна мысль... :)
8
Встречайте!
IconFonts в Эталон!
Механизм создавался простым и максимально наглядным.
Он состоит из следующих слоев:
Фабрика глифов
Разметка символов
Глиф
Менеджер
Схема иконок
Схема стилей
1
2
3
4
9
Из жизни одной иконки
FontIconManager.getBitmapData(
FontIconNames.BTN_COOL_ROUND_ICON)
1
public class IconFontNames
{
public static const collection:ArrayCollection = new ArrayCollection();
public static const BTN_COOL_ROUND_ICON:IconFont = addFontIcon(
"btnCoolRound",
ElusiveFontSet.instance, "el-asl",
IconGlyphStyles.CIRCLE_ORANGE_STYLE );
private static function addFontIcon(iconName:String, fontSet:IFontSet, glyphName:String,
glyphStyle:IconGlyphStyle):FontIcon
{
var fontIcon:FontIcon = new FontIcon(iconName, fontSet, glyphName, glyphStyle);
collection.addItem(fontIcon);
return fontIcon;
}
CollectionValidator.validate(collection, "iconName");
}
public class IconGlyphStyles
{
public static const collection:ArrayCollection = new ArrayCollection();
public static const CIRCLE_ORANGE_STYLE:IconGlyphStyle = new IconGlyphStyle(
"Круглые оранжевые иконки", 32,
0xff6c47, new SolidColor(0xfff0f5, 1),
GlyphTypes.CIRCLE_GLYPH );
private static function addGlyphStyle(name:String, fontSize:uint = 16, fontColor:uint = 0,
backgroundFill:IFill = null, glyphType:String = null,
rotateAngle:int = 0, flipMode:String = null,
transformMatrix:Matrix = null):IconGlyphStyle
{
var glyphStyle:IconGlyphStyle = new IconGlyphStyle(
name, fontSize, fontColor, backgroundFill, glyphType, rotateAngle, flipMode, transformMatrix);
collection.addItem(glyphStyle);
return glyphStyle;
}
CollectionValidator.validate(collection, "name");
}
2
3
10
public class ElusiveFontSet implements IFontSet
{
private static var _instance:ElusiveFontSet;
private static var _iconCheatlist:Dictionary;
public function get fontName():String
{
return "FontElusive";
}
public function get fontNameNonCFF():String
{
return "FontElusiveNonCff";
}
public static function get instance():ElusiveFontSet
{
if (_instance == null)
{
_instance = new ElusiveFontSet();
}
return _instance;
}
public function get cheatList():Dictionary
{
return _iconCheatlist;
}
public function get glyphFactory():IGlyphFactory
{
return ElusiveGlyphFactory.instance;
}
public function ElusiveFontSet()
{
if (_instance != null)
{
throw new IllegalOperationError("Please use instance property");
}
else
{
initialize();
}
}
public function getSymbolCode(name:String):uint
{
return _iconCheatlist[name];
}
protected function initialize():void
{
_iconCheatlist = new Dictionary();
...
_iconCheatlist["el-asl"] = 0xf10e;
}
}
3
11
public class FontIconManager
{
private static var _cachedIconsDictionary:Dictionary =
new Dictionary();
public static function getBitmapData(fontIcon:FontIcon):BitmapData
{
if (_cachedIconsDictionary[fontIcon] == null)
{
_cachedIconsDictionary[fontIcon] = createBitmap(fontIcon);
}
return _cachedIconsDictionary[fontIcon];
}
private static function createBitmap(fontIcon:FontIcon):BitmapData
{
return createGlyph(fontIcon.fontSet.glyphFactory, fontIcon.glyphName)
.applyStyle(fontIcon.glyphStyle)
.toBitmapData();
}
private static function createGlyph(factory:IGlyphFactory, iconName:String):IGlyph
{
return factory.create(iconName);
}
}
1
public interface IGlyphFactory
{
function create(name:String):IGlyph;
}
public interface IGlyph
{
function redraw():IGlyph;
function rotate(angle:int):IGlyph;
function flip(mode:String):IGlyph;
function fill(fill:IFill, glyphType:String):IGlyph;
function transform(matrix:Matrix):IGlyph;
function applyStyle(style:IconGlyphStyle):IGlyph;
function toBitmapData():BitmapData;
}
4
12
Что делать с картиночками?
Сделаем свой шрифт...
13
Теория
earth.png
Ожидание
earth.svg
earth.png
Фатальная реальность
earth.svg
14
GIMP
GNU Image Manipulation Program (сокращённо GIMP) — мощный и многоцелевой графический редактор.
earth.png
earthMask.png
15
InkScape
Графический редактор Inkscape предназначен для создания и редактирования графики SVG.
earthMask.png
earth.svg
16
Type3
Легкий инструмент для редактирования и создания шрифтов.
Утилита выпускается в двух вариантах:
- Полнофункциональный инструмент. В демонстрационном режиме есть ограничение. Можно сохранить в одном шрифте не более 50 глифов.
- Light версия. Нельзя создавать глифы на основе существующей графики. Все контуры рисуются в самой программе.
17
векторные изображения
SomeFont.ttf
...
18
Проблемы
1)
Сложный процесс преобразования иконок
2)
Много вариаций одной иконки
3)
Полный хаос в структуре ресурсов
Решения
1)
Процесс стал проще т.к. иконок взятых "с потолка", а не из готового шрифта немного. А для уникальных случаев - есть вполне понятная процедура - с аналогичным эффектом окончания :)
2)
Есть одна иконка, которую можно отобразить с разными стилями.
3)
Слой 2 хранит в себе большую часть необходимой информации. Это всего 2 класса!
19
Планы
Перенос иконок в проекте в один иконочный шрифт;
1)
Разработка регламента по добавлению и сопровождению иконок в проекте;
2)
В механизме остаются места на "Подумать".
3)
20
Спасибо за внимание!
21
Перенос растрового изображения в вектор
22
Создание сборного векторного глифа
и добавление полученного вектора в набор шрифта
23
Icon fonts
By nikitamugen
Icon fonts
- 271