PDA

Просмотр полной версии : Embed шрифта в часто используемом классе


Sintesis
01.06.2012, 17:15
Вот если у меня есть клас в который я передаю строку и координаты расположения, а он создаёт текст и я часто использую этот класс в проекте, но в этом классе есть Embed шрифта, это значит - когда я создаю новый экземпляр то текст опять встраивается во флешку? Каким способом этого лучше избежать? Может какой нибудь паттерн, например одиночка может спасти или кто как делает?

in4core
01.06.2012, 17:21
А зачем каждый раз в классе генерить шрифт? Когда достаточно создать какой нить SharedFonts классю В него вписать ВСЕ ембеды, а в мейне написать SharedFonts; и все?

Sintesis
01.06.2012, 17:51
пробовал так, вот например класс с форматами, пусть там пока один:

package src.control{
import flash.text.TextFormat;

/**
* ...
* @author Sintesis
*/
public class SharedFonts {

[Embed(source = "Arial_Narrow.ttf", fontName = "Arial Narrow", embedAsCFF="false", fontStyle="smooth", mimeType = "application/x-font")]
private var ArialNarrow:Class;

public function SharedFonts() {

}

public function getFormat01():TextFormat {

var format01:TextFormat = new TextFormat();
format01.color = 0xffffff;
format01.size = 16;
format01.font = "Arial Narrow";
return format01;
}
}
}

но при его вызове вылетает ошибка Ambiguous reference to SharedFonts_ArialNarrow.
почему имя класса встроеного шрифта присоединяется к классу в который встраиваю?

in4core
01.06.2012, 17:57
[Embed(source="../someFont.ttf",
fontName = "myFont",
mimeType = "application/x-font",
fontWeight="normal",
fontStyle="normal",
unicodeRange="englishRange",
advancedAntiAliasing="true",
embedAsCFF="false")]
private var myEmbeddedFont:Class;

Добавлено через 1 минуту
Покажите что вы делаете. Пока я вижу только начинку класса. этого мало. И уберите формат пока что. Шаред только для встройки стоит делать , понятнее будет и вам

Sintesis
01.06.2012, 18:29
Так всё заработало, класс текста который использовал был унаследован от TextField, унаследовал от Sprite и всё пошло. Не знаю хороший ли выход? Просто нужен класс который можно использовать так

var form:SharedFonts = new SharedFonts();
var text:Text = new Text("мой текст...", form.format01());
text.textPosition(20, 200);
objMenu.addChild(text);


вот он работает:

package src.control{
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;


public class Text extends Sprite {



private var menuText:TextField;

public function Text(_text:String, _format:TextFormat) {

menuText = new TextField();
menuText.autoSize = TextFieldAutoSize.LEFT;
menuText.defaultTextFormat = _format;
menuText.embedFonts = true;
menuText.selectable = false;
menuText.text = _text;
addChild(menuText);
}

public function textPosition(_textX:Number, _textY:Number):void {

menuText.x = _textX;
menuText.y = _textY;
}
}
}

Но хотелось, что-б он был унаследован не от Спрайт, а от ТекстФтлд например(

in4core
01.06.2012, 18:33
Ну блин же, не так это делается а вот так

class SharedFonts ( начинка только эмбед, и ни от чего не расширяем. В main чтобы классс вкомпилися пишем просто SharedFonts; ВСЕ круто )
class DisplayText(...rest) форматы и прочее + создание текстовых поле, статичный класс.

private var _textField:TextField = DisplayText.addField('sharedFontName',14,'left');
addChild(_textField)

Sintesis
01.06.2012, 18:41
а DisplayText это что за класс? Расширенный TextField?

in4core
01.06.2012, 18:49
Нет. просто приватные поля. Не расширяется ни от чего

Добавлено через 1 минуту
package com.in4core.text
{
import flash.text.TextField;
import flash.text.TextFormat;
/**
* ...
* @author in4core
*/
public class DisplayText extends Object
{
private static var _textfield:TextField;


public static function addField ( font:String = null , size:uint = 12, bitmapFonts:Boolean = false,

autosize:String = 'left', isMulti:Boolean = false, text:String = '' ) : TextField

{
_textfield = null;

_textfield = new TextField();

_textfield.defaultTextFormat = setFormat(size, font);

_textfield.autoSize = autosize;

_textfield.text = text;

if (isMulti) _textfield.multiline = true;

_textfield.selectable = false;

if (!bitmapFonts) _textfield.antiAliasType = 'advanced';

if (font != null) _textfield.embedFonts = true;
else font = '_sans';

return _textfield;
}

private static function setFormat( size:uint, font:String ):TextFormat {

var tf:TextFormat = new TextFormat();

tf.size = size;

tf.font = font;

return tf;
}

}

}

Sintesis
01.06.2012, 18:57
А это, объект с текстфилдами, хорошо, нужно попробовать, спасибо!

in4core
01.06.2012, 19:04
Ну объект это так чисто для красоты. Любой класс он же от объекта наследуется по факту, поэтому я иногда пишу, а так можно было бы и без всего писать разницы никакой