Archiv ‘ActionScript’ kategorie

Flash CS5 - embed fonts pro HTML text

Neděle, Říjen 10th, 2010

Průvodce embedováním fontů ve Flashi CS5 je vylepšený, což ale může vést ke zdání, že zobrazení HTML textu v poli s embedovanými znaky je snadné. Jak tedy bezproblémově naformátovat HTML v poli s emebdnutými znaky?

Budeme pracovat s externím CSS souborem (styl.css):

.text1 {
font-weight: bold;
color: #00ff00;
font-size: 12px;
}
.text2 {
color: #0000ff;
font-size: 12px;
font-weight: bold;
}
.text3 {
color: #ff0000;
font-size: 12px;
}

V ActionScriptu pak připojíme css k poli s html textem:

var csssheet:StyleSheet = new StyleSheet();
var reqcss:URLRequest=new URLRequest("styl.css");
var cssLoader:URLLoader = new URLLoader();
cssLoader.addEventListener(Event.COMPLETE, onCSSFileLoaded);
cssLoader.load(reqcss);
function onCSSFileLoaded(event:Event):void {
csssheet.parseCSS(cssLoader.data);
txt.styleSheet = csssheet;
txt.embedFonts = true;
txt.htmlText = "<span class='text1'>Text styl 1, </span> <span class='text2'>Text styl 2, </span><span class='text3'>Text styl 3, </span>";
}

Nesmíme zapomenout embednout oba styly (Regular, Bold) pro daný font.  POZOR! V průvodci se sice oba objeví jako emebdnuté, ale aby se skutečně exportovaly do SWF, musí být ve scéně DVĚ dynamická textová pole, kde jedno má Regular styl, druhé pak Bold. Jinak se exportuje pouze jeden styl písma.

Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation

Sobota, Květen 9th, 2009

Po delší době strávené na stavbě jsem se dostal zase k práci a hned mě u jednoho projektu přivítala tahle klasická hláška, která se objevuje v okamžiku, kdy načítáme data z jiné domény a není to povoleno přes crossdomain.xml.  Jaké bylo ale moje překvapení, když se hláška objevila při načítání dat ze stejné úrovně - domény. Žádný háček v podobě subdomény nebo nadřazeného adresáře zde nebyl.

Situace byla ale zajímavější, než se zdálo. Externímy daty byl PHP soubor, jehož cesta byla brána relativně vůči SWF souboru aplikace, tento PHP soubor byl umístěn v podadresáři. Načítání fungovalo pouze v IE, Mozilla hlásila uvedenou chybu. Po zpěšném zapátrání v Googlu jsem nic rozumného nenašel, nicméně jsem při testování zkusil uvést úplnou cestu k PHP souboru. A ejhle, zafungovalo to! Takže místo relativní cesty pomohlo uvedení absolutní cesty. Snad se časem dopátrám důvodu, proč se tak stalo.

BatchLoader pro textové soubory

Pátek, Duben 10th, 2009

Poměrně často se setkávám s nutností stahování většího množství souborů najednou, jehož řešením je postupné načítání souborů jeden po druhém. Bylo by tedy určitě dobré mít nějakou třídu, která se o načtení souborů postará například v této podobě:

//instance objektu
var bLoader:BatchLoader = new BatchLoader(pole_souboru);
//načtení souborů z předaného pole
bLoader.load();
//doplnění listenerů
bLoader.addEventListener(BatchEvent.ALL_COMPLETE,loadCompl);
bLoader.addEventListener(BatchEvent.IO_ERROR,err);
function loadCompl(evt:Event):void{
  var pole_nactenych:Array = bLoader.getLoadedArray();
}

Jednoduchou třídu, která toto splňuje nalezneme v detailu článku.

(more...)

Včerejší a zítřejší den

Úterý, Duben 7th, 2009

Po delší době jsem opět použil při práci s kalendářem malou třídu, která vrací předchozí a následující den:

package
{
public class TimeUtil
{
private static var oneDayMs:uint = (1000*60*60*24);
public static function yesterday():Date{
var today:Date = new Date();
var yest:Date = new Date();
yest.setTime(today.getTime()-oneDayMs);
return yest;
}
public static function tomorrow():Date{
var today:Date = new Date();
var tom:Date = new Date();
tom.setTime(today.getTime()+oneDayMs);
return tom;
}
}
}

Použití je snadné:

var vcera:Date = TimeUtil.yesterday();

Ve spojení s komponentou DateChooser pak můžeme omezit výběr starších dnů:

var yest:Date = TimeUtil.yesterday();
calendarComp.disabledRanges = [{rangeEnd:yest}];

Otáčení mimo střed objektu

Neděle, Březen 15th, 2009

Třída MatrixTransformer je poměrně užitečná, pokud potřebujeme například manipulovat s objekty (měnit velikost, zkosení, rotaci apod.)  přes Matrix třídu. Jednou z výborných metod je pak rotateAroundExternalPoint, která nám umožňuje rotaci objektu podle libovolného bodu na scéně. Běžná rotace totiž probíhá přesně podle souřadnicového středu objektu, což může být občas prolém. Následující skript ukazuje využití této metody (po kliknutí se objekt bude otáčet podle nového bodu):

import fl.motion.MatrixTransformer;
var xPoint:int = 200;
var yPoint:int = 200;
var angle:int = 5;
function changeTrasnfPoint(evt:Event):void {
    xPoint = this.stage.mouseX;
    yPoint = this.stage.mouseY;
}
function rotate(evt:Event):void {
    var matrix:Matrix = obj_mc.transform.matrix;
    MatrixTransformer.rotateAroundExternalPoint(matrix,
xPoint,yPoint,angle);
    obj_mc.transform.matrix = matrix;
}
this.addEventListener( Event.ENTER_FRAME,rotate);
this.stage.addEventListener(MouseEvent.MOUSE_DOWN,
changeTrasnfPoint);

Hromadná oprava XML

Pondělí, Březen 9th, 2009

Při práci s XML daty v ActionScriptu 3.0 se moc nezapotíme (vyjma opomenutí data binding, ale o tom jindy). Pokud porovnám práci (spíše trápení) s XMLkem v AS2, tak v AS3 je to doslova hraní.

V případě, že do vstupních XML dat aplikace může zasáhnout lidský faktor, může se stát, že některé hodnoty nedostaneme v požadované formě, jak očekáváme.  Klasickým příkladem může být zadávání nepovolených znaků, textu místo čísel a někdy vadí i nesprávné kombinování velkých a malých písmen.

Pokud potřebujeme překontrolovat vstupní data, jednou z možností je odfiltrování konkrétního elementu následujícím způsobem:

var pomList:XMLList = dataXML..xmlElement;

Do XMLList objektu se vloží pouze elementy xmlElement ze zdrojového xml objektu dataXML. Nezáleží, kde jsou umístěné, pomocí dvoutečkové syntaxe získáme zpět opravdu všechny, které se v XML datech vyskytují.

V dalším kroku už stačí projít prvky XMLListu a provést s nimi požadovanou kontrolu. Protože jsou do prvků XMLListu vloženy přímé reference na zdrojové XML elementy, změna se projeví ve zdrojovém XML objektu. Zmíněné zvětšení vstupních dat na velká písmena pak může vypadat takto:

var pomList:XMLList = dataXML..xmlElement;
for (var s:uint=0; s<pomList.length(); s++) {
if (String(pomList[s]).length>0) {
pomList[s] = String(pomList[s]).toUpperCase();
}
}