PDA

Volledige versie bekijken : embed font in library + css [opgelost]


kippewit
%Europe/Berlin %668 %2007, 16:02
Hoi,

Ik wou de tekst in mijn textfield in een embedded font willen weergeven. Ik had een font aan mijn Library toegevoegd.
Echte naam = Emma-normal
Name = EmmaFont
Export for Actionscript = ja
Class = EmmaFont

Nu was het mij gelukt dat font te embedden, door var myFont:Font = new EmmaFont(); te gebruiken.

Maar! Nu zou ik graag een cssfile gebruiken, zodat ik ook verschillende embedded fonts kan gebruiken in 1 tekst.

Dit is mn actionscript (ik heb er wat tussenuit gehaald):
package
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.text.*;
import flash.events.*;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
import fl.managers.StyleManager;
import fl.controls.UIScrollBar;
import flash.net.FileReference;
import flash.net.URLLoader;
import flash.net.URLRequest;

public class TextPage extends Sprite
{
var loader:URLLoader;
var exampleText:String = "<h1>This is a headline</h1>" +
"<p>This is a line of text. <span class='bluetext'>" +
"This line of text is colored blue.</span></p>";

public function TextPage(url)
{

}

public function initAnimation(event:Event):void
{
descrTextField = new TextField();
descrTextField.width = 550;
descrTextField.autoSize = TextFieldAutoSize.LEFT;
descrTextField.wordWrap = true;
addChild(descrTextField);

var req:URLRequest = new URLRequest("example.css");

loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onCSSFileLoaded);
loader.load(req);
}
public function onCSSFileLoaded(event:Event):void
{
var sheet:StyleSheet = new StyleSheet();
sheet.parseCSS(loader.data);
descrTextField.styleSheet = sheet;
descrTextField.htmlText = exampleText;
}
}
}

Dit is m'n css:
p {
font-family: EmmaFont;
font-size: 14;
}

h1 {
font-family: EmmaFont;
font-size: 20;
font-weight: normal;
}

.bluetext {
color: #0000CC;
}

Dat werkt dus niet.

Wat vergeet ik, of wat doe ik fout?


Alvast bedankt

theFlashWizard
%Europe/Berlin %742 %2007, 17:49
ActionScript bedenkt in ieder geval een andere naam voor je font na embedden.
Ik heb altijd een loopje waarmee ik door me enumerated fonts ga. Zo weet ik zeker welke naam hij maakt.

Verder zie ik je trouwens niet de embedFonts propertie op true zetten op het textfield?

jawel
%Europe/Berlin %021 %2007, 00:30
Volgens mij moet je dan in je css Emma-normal invoeren. In AS gebruik je ook FontClass.fontName. Maar ik ben een beetje een idioot dus ik zou niet zo snel naar mij luisteren.

kippewit
%Europe/Berlin %399 %2007, 09:35
Nou, de embedFonts was ik vergeten. Dom zeg.

Maar nu: hoe kan ik ervoor zorgen dat ik de stylesheet maar 1 keer hoef in te laden? Vanuit mijn document class maak ik bijvoorbeeld dit aan:

var news = new News();

In de class News maak in TextFields aan. Hoe zorg ik ervoor dat ik daarop steeds dezelfde stylesheet kan toepassen? Ik neem aan dat ik hem niet bij elke nieuwe class opnieuw moet laden.

Danke!

theFlashWizard
%Europe/Berlin %440 %2007, 10:34
Dan zou ik dit bijhouden in 1 singleton class waar ze allemaal gebruik van maken.

kippewit
%Europe/Berlin %465 %2007, 11:10
En heb je een voorbeeldje van hoe ik een singleton class moet opbouwen en aanspreken? Ik vind er helemaal niks over terug in Essential ActionScript 3.

theFlashWizard
%Europe/Berlin %521 %2007, 12:31
In Essential ActionScript 3.0 zijn ze ook helaas niet toegekomen aan design patterns.
Het staat wel in Essential ActionScript 2.0 of Head First Design Patterns.
Maar ik weet ook zeker dat je op inet zat voorbeelden tegen kan komen, misschien wel hierbij:
Actionscript Tutorials -> OOP (http://www.flashfocus.nl/forum/showthread.php?t=6338#oop)
Actionscript Tutorials -> OOD (http://www.flashfocus.nl/forum/showthread.php?t=6338#ood)
Actionscript Tutorials -> Design patterns (http://www.flashfocus.nl/forum/showthread.php?t=6338#design patterns)

kippewit
%Europe/Berlin %518 %2007, 12:26
Ik dacht het zo op te lossen, maar zoiets werkt dus niet.

package
{
import flash.events.*;
import flash.net.*;
import flash.text.StyleSheet;


public class Singleton
{

private static var instance:Singleton = new Singleton();
public static var sheet:StyleSheet;
public static var loader;

public function Singleton()
{

if ( instance )
{
throw new Error("Singleton and can only be accessed through Singleton.getInstance()");
}
var req:URLRequest = new URLRequest("example.css");
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onCSSFileLoaded);
loader.load(req);
}

public static function getInstance():Singleton
{
return instance;
}

public function onCSSFileLoaded(event:Event):void
{
sheet = new StyleSheet();
sheet.parseCSS(loader.data);
}

public static function getStyleSheet():Singleton
{
trace("getstylesheet");
return sheet;
}

}
}

kippewit
%Europe/Berlin %592 %2007, 14:13
Ik heb het zelf kunnen oplossen. Bedankt voor de tips.

theFlashWizard
%Europe/Berlin %615 %2007, 14:45
Hoe heb je het dan opgelost?
(Kunnen anderen weer wat van leren)

kippewit
%Europe/Berlin %623 %2007, 14:58
Ik heb het nu zo gedaan:

package {
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.*;

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.text.StyleSheet;


public class Settings extends Sprite {

public static var stage:Stage;
public static var root:DisplayObject;
public var ssheet:StyleSheet;
public var sloader;

public function Settings() {
Settings.stage=this.stage;
Settings.root=this;

var req:URLRequest = new URLRequest("example.css");

sloader = new URLLoader();
sloader.addEventListener(Event.COMPLETE, onCSSFileLoaded);
sloader.load(req);

}

public function onCSSFileLoaded(event:Event):void
{
ssheet = new StyleSheet();
ssheet.parseCSS(sloader.data);
Settings.ssheet = ssheet;
}


}
}

De stylesheet zelf kan ik dan overal benaderen met Settings.ssheet