Master HTML geformatteerde tekst in Flash

We gaan kijken hoe u HTML-opgemaakte tekst uit XML kunt weergeven, gestileerd van een externe CSS-stylesheet met lettertypen die tijdens runtime zijn geladen. We beheren ook de plaatsing van inline afbeeldingen via de HTML embed tag en voeg aangepaste events toe aan HTML-tekstkoppelingen.


Stap 1: Waarom HTML-geformatteerde tekst en externe activa gebruiken?

Het is zeker gemakkelijk om alle assets direct in het Flash-bronbestand zelf te bewaren, en soms is dat de beste oplossing. Er zijn echter enkele goede redenen om zoveel mogelijk inhoud apart van uw Flash-document te houden, of zelfs om uw Flash-bron uitsluitend uitsluitend uit ActionScript te laten bestaan..

  1. Uw SWF wordt sneller geladen. Door de inhoud gescheiden te houden van het Flash-bestand, kunt u alleen de items laden die u tijdens runtime nodig heeft, waardoor uw inhoud sneller wordt geleverd.
  2. Updates zijn eenvoudiger. In plaats van een Flash-ontwikkelaar te verplichten de .fla te openen en opnieuw te publiceren, is alles wat nodig is een eenvoudige bewerking van de html of css.
  3. Meerdere applicaties. De externe inhoud is beschikbaar voor gebruik voor andere toepassingen, zoals voor het maken van een HTML5-versie van de site voor de iPad.
  4. OOP. Het beste van alles, het gescheiden houden van de inhoud van de bezorgapplicatie is een goede objectgeoriënteerde programmering. Methoden zoals deze zijn de bouwstenen voor het ontwikkelen van systemen, sjablonen en componenten voor hergebruik en snelle ontwikkeling.

Stap 2: Stel de pakketdirectory in

Omdat we met een verscheidenheid aan activa zullen werken, is het handig om een ​​goed georganiseerde bestandsdirectorystructuur in te stellen. Eerst maken we een projectmap "HTMLTextBlock". Voeg daarbinnen een map "source" en een map "deploy" toe. In inzetten, onze SWF bevindt zich op het hoogste niveau, samen met mappen voor elk type inhoud. In deze demo maken we een SWF die lettertypen, CSS, XML en een afbeelding laadt. De bronmap bevat al onze .fla- en .as-bestanden, die we later zullen maken. Voor nu zou uw projectdirectory er als volgt uit moeten zien:


Stap 3: kies uw lettertypen

Voordat u lettertypen op uw website insluit, is het belangrijk om u bewust te zijn van lettertypelicenties. Alleen al omdat je een lettertype hebt geïnstalleerd, zelfs als je het recht hebt om te gebruiken voor afdrukken, betekent dit niet dat je toestemming hebt om het online te gebruiken. Raadpleeg dit Themeforest-artikel voor meer informatie over het licentiëren van lettertypen.

In deze zelfstudie gebruiken we twee lettertypen, één voor de kop en één voor de hoofdtekst. Een goede plek om open source-lettertypen van hoge kwaliteit te vinden, is de Google Font Directory. U kunt de lettertypebestanden niet rechtstreeks vanaf daar downloaden, maar ze kunnen gemakkelijk worden gevonden met een zoekopdracht op internet. Font Squirrel en Typekit zijn twee uitstekende bronnen voor lettertypen van hoge kwaliteit.

Let bij het kiezen van een koplettertype op een stijl die de persoonlijkheid van uw ontwerp uitdrukt. Voor hoofdtekst is leesbaarheid erg belangrijk, dus gebruik een lettertype dat goed wordt weergegeven in kleine formaten. Zorg er ook voor dat u een lettertypefamilie kiest met cursieve, cursieve en vetgekleurde gezichten. Voor deze tutorial gebruiken we het lettertype Lobster van Pablo Impallari voor koppen en de lettertypefamilie Droid Serif van Steve Matteson voor paragrafen.

Snelle online zoekopdrachten onthullen waar we het Lobster-lettertype en de Droid Serif-lettertypefamilie kunnen downloaden. In onze bron map, maak een nieuwe map "gedownloade lettertypen" en plaats daar de lettertypebestanden.


Stap 4: SWF-bestanden maken voor Runtime-inscriptie van lettertypen

Activeer de lettertypen op uw systeem. Open twee nieuwe ActionScript 3.0 Flash-documenten, één voor elk lettertype en sla op in de bron directory. We beginnen met het koplettertype. Selecteer in het deelvenster Bibliotheek "Nieuw lettertype ..." en in de Familie dropdown, selecteer Kreeft 1.4. Typ onder 'Naam kreeft'. Voor Tekenreeksen, controleren Allemaal. Opmerking: als u een lettertype gebruikt waarvan u weet dat u bepaalde tekens niet zult gebruiken, kunt u ervoor kiezen om een ​​subset glyphs uit het lettertype in te sluiten, waardoor de bestandsgrootte van de SWF afneemt.

Ga vervolgens naar het tabblad ActionScript. Onder verbinding, kiezen Exporteren voor ActionScript. Wanneer je dat doet, Exporteer in frame 1 wordt gecontroleerd, en de Klasse en Basisklasse ID's worden ingevuld. Klik op Gedaan. Als u een waarschuwing krijgt dat de klassedefinitie niet is gevonden, negeert u deze.

Schakel vervolgens in het paneel Publicatie-instellingen het vinkje uit HTML checkbox en, in de Flash veld, richt op fonts map in de inzetten map door "... /deploy/fonts/Lobster.swf" in te voeren. Dit is alles wat nodig is om een ​​lettertype in te sluiten in een SWF.

Als we echter de SWF in een andere SWF willen laden en de ingesloten lettertypen tijdens runtime willen gebruiken, moeten we het lettertype registreren. In het deelvenster Handelingen moeten we dus een lijncode toevoegen aan frame 1 op de tijdlijn:

 Font.registerFont (kreeft);

Nu is ons lettertype beschikbaar voor gebruik in Flash-documenten die de SWF laden. We kunnen hier klaar zijn, maar we willen ons werk controleren en, nog belangrijker, de juiste lettertypefamilienaam gebruiken in onze CSS. Voeg wat meer code toe.

 var embeddedFonts: Array = Font.enumerateFonts (false); voor elk (var-lettertype: Font in embeddedFonts) trace ("Font Embedded:" + font.fontName); 

Publiceer Voorbeeld uitvoeren en we zullen het bericht hieronder in het uitvoerlogboek zien. Let op de naam van het lettertype. We hebben het later nodig.

 Lettertype ingesloten: kreeft 1.4 Lettertype ingesloten: kreeft 1.4

U vraagt ​​zich misschien af ​​waarom we twee traceerinstructies zien. Dit is te wijten aan registerFont () methode die het lettertype een tweede keer insluit.

 Font.registerFont (DroidSerifRegular); Font.registerFont (DroidSerifBold); Font.registerFont (DroidSerifItalic); Font.registerFont (DroidSerifBoldItalic); var embeddedFonts: Array = Font.enumerateFonts (false); voor elk (var-lettertype: Font in embeddedFonts) trace ("Font Embedded:" + font.fontName + "" + font.fontStyle); 

Vervolgens maken we een SWF voor de body-kopie. Deze keer embedden we vier lettertypen, één voor elke stijl. Selecteer in ons tweede Flash-document opnieuw vanuit het deelvenster Bibliotheek Nieuw lettertype ... Selecteer in het vervolgkeuzemenu Familie de optie Droid Serif en selecteer Regulier voor Stijl. Type "DroidSerifRegular" in het veld Naam en vergeet niet in te stellen Exporteren voor ActionScript. Herhaal vervolgens dezelfde stappen voor de tekenreeksen en het ActionScript-tabblad. Herhaal dit proces voor de vetgedrukte, cursief en cursief gedrukte gezichten. In het deelvenster Acties gebruiken we dezelfde code als die we hebben gebruikt voor het Lobster-lettertype.

Publicatie voorbeeld uitvoeren. Deze keer zullen we traceerberichten zien voor elk van de lettertypen van Droid Serif. Als u minder dan acht ziet, controleert u de lettertype-instellingen in het deelvenster Bibliotheek, omdat een van de lettertypen niet wordt ingesloten. Let opnieuw op de naam van het lettertype in het uitvoerlogboek.

 Lettertype Embedded: Droid Serif standaard lettertype Embedded: Droid Serif vet Lettertype Embedded: Droid Serif cursief Lettertype Embedded: Droid Serif boldItalic Lettertype Embedded: Droid Serif cursief Lettertype Embedded: Droid Serif vet Lettertype Embedded: Droid Serif regulier lettertype Embedded: Droid Serif boldItalic

Publiceer nu het lettertype Droid Serif in "... /deploy/fonts/DroidSerif.swf" en we zouden nu twee lettertype-SWF's moeten hebben, Lobster.swf en DroidSerif.swf, in de implementeren / fonts directory.


Stap 5: HTML in XML plaatsen

Het volgende item dat we zullen maken is een xml-bestand. De XML bestaat uit één element: een blok met HTML-opgemaakte tekst, bestaande uit een kop en alinea opgebouwd met standaard HTML-tagging.

Om ervoor te zorgen dat Flash de HTML-code als een XML-elemententiteit kan lezen, moet deze zich in een CDATA-wrapper bevinden. CDATA wordt gebruikt in XML-documenten om aan te geven dat een gedeelte van de inhoud moet worden geparseerd als tekengegevens in plaats van als markup.

   Resizable, HTML-geformatteerd TextField met Runtime-lettertype inbedden & CSS-styling 

Dit is een voorbeeld van een tekstveld met een inline-afbeelding. De tekst is geladen vanuit een xml-bestand en is gestileerd met een externe CSS-stylesheet. De lettertypefamilie Droid Serif, waarnaar wordt verwezen door de CSS, is tijdens runtime geladen. De beschikbare stijlen voor Droid Serif zijn stoutmoedig, cursief en vet cursief. Droid Serif is gemaakt door Steve Matteson. Het koplettertype Lobster is gemaakt door Pablo Impallari.

]]>

Sla dit bestand op als "content.xml" in de xml map in de inzetten directory


Stap 6: CSS-stylesheet maken

Nu gaan we CSS maken om de HTML te stijlen. Als we naar onze HTML kijken, kunnen we zien dat we styling moeten maken voor h1, p en een. De tekst binnen de vetgedrukte en cursieve tags (b en ik) wordt automatisch gestileerd, omdat deze stijlen aanwezig zijn in onze alineatypefamilie. Houd er rekening mee dat Flash alleen een subset van CSS-eigenschappen ondersteunt; raadpleeg de Naslaggids voor ActionScript 3.0 voor meer informatie.

Het is vooral belangrijk dat we de juiste lettertypefamilienaam in de CSS targeten. Gebruik de lettertypenaam die werd weergegeven in het uitvoerlogboek toen we de lettertypedocumenten publiceerden (Kreeft 1.4 en Droid Serif).

 h1 font-family: Lobster 1.4; font-size: 24; color: # 990033;  p font-family: Droid Serif; font-size: 14; color: # 333333; leidt: 4;  a color: # 000000; text-decoration: onderstrepen; 

Sla dit bestand op als "styles.css" in de css map in de inzetten directory


Stap 7: Maak de documentklasse

Maak een nieuw Flash-bestand en sla op als "HTMLTextBlockExample.fla" in de bron directory. Ga naar het paneel Publicatie-instellingen in het venster Publicatie-instellingen inzetten map. Voor HTML, gebruik "... /deploy/index.html" in plaats van de standaardnaam. Maak een nieuw .as-bestand - "HTMLTextBlockExample.as" - om de documentklasse te zijn (raadpleeg deze snelle tip voor meer informatie over documentklassen).

 pakket import flash.display.MovieClip; public class HTMLTextBlockExample verlengt MovieClip public function HTMLTextBlockExample (): void 

Stap 8: laad de lettertypen

Vervolgens laden we de lettertype-SWF's die we hebben gemaakt in ons Flash-document. Laten we twee variabelen maken. De ene zal een zijn reeks van de url-strings voor elk lettertype SWF, en de andere is een int die bijhoudt hoeveel lettertypen er zijn geladen. Vervolgens maken we verschillende methoden om het laden aan te kunnen.

 pakket import flash.display.Loader; import flash.display.MovieClip; import flash.events.Event; import flash.events.IOErrorEvent; import flash.net.URLRequest; public class HTMLTextBlockExample breidt MovieClip uit public var fonts: Array / * of String * / = ["fonts / DroidSerif.swf", "fonts / Lobster.swf"]; public var fontsLoaded: int = 0; openbare functie HTMLTextBlockExample (): void loadFonts ();  private functie loadFonts (): void for each (var fontURL: String in fonts) var fontLoader: Loader = new Loader (); fontLoader.contentLoaderInfo.addEventListener (Event.COMPLETE, onFontLoaded); fontLoader.contentLoaderInfo.addEventListener (IOErrorEvent.IO_ERROR, onFontLoadError); fontLoader.load (nieuwe URLRequest (fontURL));  persoonlijke functie onFontLoadError (event: IOErrorEvent): void trace ("ERROR: Could not find font" + event.target.loaderURL);  private function onFontLoaded (event: Event): void fontsLoaded ++; if (fontsLoaded == fonts.length) onFontsLoadComplete ();  private function onFontsLoadComplete (): void trace (fonts.length + "fonts are loaded"); 

Voorbeeld publiceren uitvoeren en zien dat beide lettertypen zijn geladen.


Stap 9: laad de XML en CSS

Het laden van de XML- en CSS-bestanden zal een soortgelijk proces zijn als het laden van de lettertypen. Eerst moeten we enkele nieuwe klassen importeren.

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

We zullen ook een nieuw maken StyleSheet variabele die de opmaakeigenschappen bevat die zijn geparseerd uit het css-bestand.

 public var textStyleSheet: StyleSheet;

Nu voegen we de methoden toe voor het laden van de items.

 private function onFontsLoadComplete (): void trace (fonts.length + "fonts are loaded"); loadCSS ();  private function loadCSS (): void var loader: URLLoader = new URLLoader (); loader.addEventListener (Event.COMPLETE, onCSSLoadComplete); loader.load (nieuwe URLRequest ("css / styles.css"));  private function onCSSLoadComplete (event: Event): void textStyleSheet = new StyleSheet (); textStyleSheet.parseCSS (event.target.data); loadXML ();  private function loadXML (): void var loader: URLLoader = new URLLoader (); loader.addEventListener (Event.COMPLETE, onXMLLoadComplete); loader.load (nieuwe URLRequest ("xml / content.xml"));  private function onXMLLoadComplete (event: Event): void trace (XML (event.target.data) .toXMLString ()); 

Voer publicatievoorbeeld uit en u ziet de XML in het uitvoerlogboek.


Stap 10: Maak een HTMLTextBlock-klasse

Het weergeven van HTML-opgemaakte tekst is iets wat u vaak kunt doen, dus laten we een klasse maken die we steeds opnieuw kunnen gebruiken. Open een nieuw ActionScript-bestand en sla het op als "HTMLTextBlock.as" in de bron directory.

 pakket import flash.display.Sprite; import flash.text.StyleSheet; import flash.text.AntiAliasType; import flash.text.TextField; import flash.text.TextFieldAutoSize; public class HTMLTextBlock breidt Sprite uit // Width of the htmlTextField. Standaard is 550 pixels. public var blockWidth: int = 550; // StyleSheet voor htmlTextField. public var textStyleSheet: StyleSheet = new StyleSheet (); // Bevat de html-opgemaakte tekst. private var htmlTextField: TextField = new TextField (); public function HTMLTextBlock () htmlTextField.embedFonts = true; htmlTextField.wordWrap = true; htmlTextField.multiline = true; htmlTextField.condenseWhite = true; htmlTextField.antiAliasType = AntiAliasType.ADVANCED; addChild (htmlTextField);  openbare functie setHTML (htmlText: String): void htmlTextField.autoSize = TextFieldAutoSize.LEFT; htmlTextField.width = blockWidth; htmlTextField.styleSheet = textStyleSheet; htmlTextField.htmlText = htmlText; 

Zoals u kunt zien, heeft onze klasse drie variabelen. De privévariabele htmlTextField bevat HTML-opgemaakte tekst. De openbare variabele blockWidth regelt de breedte van htmlTextField, en textStyleSheet bevat de CSS-stijl waarop wordt toegepast htmlTextField. In de constructor stellen we eigenschappen in htmlTextField en voeg het toe aan de weergavelijst. Als laatste creëren we setHTML () voor het invoegen van HTML-opgemaakte tekst htmlTextField.


Stap 11: Gebruik HTMLTextBlock in ons hoofddocument

Nu we een aangepaste klasse hebben voor het weergeven van HTML-tekst, laten we deze gebruiken. Begin met modificeren onXMLLoadComplete () om XML-gegevens als een tekenreeks naar een nieuwe methode te verzenden die wordt gebruikt HTMLTextBlock om de HTML weer te geven.

 private function onXMLLoadComplete (event: Event): void // get xml from event target data var xml: XML = XML (event.target.data); // converteer de xml naar een tekenreeks var xmlString: String = xml; // stuur xml string naar de displayHTML-methode displayHTML (xmlString);  persoonlijke functie displayHTML (htmlText: String): void var htmlTextBlock: HTMLTextBlock = new HTMLTextBlock (); // stel de breedte in en vorm htmlTextBlock.blockWidth = 420; htmlTextBlock.textStyleSheet = textStyleSheet; // stuur de html-reeks naar de klasse HTMLTextBlock htmlTextBlock.setHTML (htmlText); // stel positie in en voeg toe aan fase htmlTextBlock.x = 20; htmlTextBlock.y = 10; addChild (htmlTextBlock); 

Het resultaat:


Stap 12: voeg een inline afbeelding toe

Vervolgens voegen we een afbeelding toe aan ons tekstblok. U kunt de afbeelding in de bronbestanden van deze zelfstudie gebruiken of deze zelf maken.

Open content.xml, en gebruik aan het begin van de alinea een eenvoudige HTML tag om de afbeelding in te sluiten. Je XML zou er nu als volgt uit moeten zien:

   Resizable, HTML-geformatteerd TextField met Runtime-lettertype inbedden & CSS-styling 

Dit is een voorbeeld van een tekstveld met een inline-afbeelding. De tekst is geladen vanuit een xml-bestand en is gestileerd met een externe CSS-stylesheet. De lettertypefamilie Droid Serif, waarnaar wordt verwezen door de CSS, is tijdens runtime geladen. De beschikbare stijlen voor Droid Serif zijn stoutmoedig, cursief en vet cursief. Droid Serif is gemaakt door Steve Matteson. Het koplettertype Lobster is gemaakt door Pablo Impallari

]]>

Nu zal de SWF dit zien:

De uitlijning van de afbeelding en de tekst lijkt nog niet helemaal goed. We zullen dat in de komende stappen verbeteren.


Stap 13: Geef de afbeelding een ID

In de tutorial komen we methoden tegen die gericht zijn op het inline-beeld. Om dit te doen, moeten we een toevoegen ID kaart attribuut aan onze embed embed-tag waarnaar kan worden verwezen in ActionScript. Open content.xml en werk het tag als volgt:

 ]]>

Stap 14: Detecteer TextField Resize

Om de uitlijning van de afbeelding aan te passen, moeten we de afbeelding wijzigen X en Y waarden. We moeten dit echter doen nadat de afbeelding is toegevoegd en de tekst is opnieuw geplaatst. Om dit te bereiken, zullen we een gebeurtenislistener toevoegen aan de HTMLTextBlock klasse.

Importeer eerst enkele aanvullende klassen:

 import flash.display.DisplayObject; import flash.display.Loader; import flash.events.Event;

Werk vervolgens het setHTML () methode en maak een gebeurtenishandler aan voor wanneer htmlTextField is van grootte veranderd.

 openbare functie setHTML (htmlText: String): void htmlTextField.autoSize = TextFieldAutoSize.LEFT; htmlTextField.width = blockWidth; htmlTextField.styleSheet = textStyleSheet; htmlTextField.htmlText = htmlText; var loader: Loader = htmlTextField.getImageReference ("image") als Loader; if (loader) // gebeurtenislistener toevoegen voor wanneer het htmlTextField de grootte van de afbeelding htmlTextField.addEventListener (Event.CHANGE, onImageAdded) wordt gewijzigd;  // anders is er geen verwijzing naar afbeeldingen, dus doe niets privé-functie onImageAdded (event: Event): void // toegang tot de afbeelding van de afbeeldingsreferentie in het tekstveld var loader: Loader = htmlTextField.getImageReference ("afbeelding") als lader; var afbeelding: DisplayObject = loader.content; 

Stap 15: Pas de beeldafstemming aan

Merk op hoe het beeld niet goed uitlijnt met de tekst? Dit komt omdat Flash automatisch horizontale en verticale afstanden rond de afbeelding toevoegt. We kunnen de hoeveelheid spatiëring aanpassen door de hspace en vspace attributen in de label.

 ]]>

Kijkend naar de SWF, wordt de afbeelding nu netjes uitgelijnd binnen de alinea, maar de tekst staat te dicht bij de afbeelding.

Het lijkt erop dat we toch wat ruimte nodig hebben. Werk de kenmerken van de afbeeldingstag bij die moeten zijn hspace = "5" vspace = "2". Dit geeft ons een betere afstand, maar nogmaals zal het beeld niet worden uitgelijnd met de linkerrand van de alinea. We kunnen dit oplossen door de X waarde van de afbeelding in onImageAdded ().

 private function onImageAdded (event: Event): void // toegang tot de afbeelding van de afbeeldingsreferentie in het tekstveld var loader: Loader = htmlTextField.getImageReference ("image") als Loader; var afbeelding: DisplayObject = loader.content; // pas de x-positie van de afbeelding aan om hspace image.x - = 5 te compenseren; 

Stap 16: Pas de spatiëring van de alinea aan

De afbeelding is mooi uitgelijnd, maar de alinea lijkt iets te dicht bij de kop te staan. Als we aan een HTML-pagina zouden werken, zouden we de opvulling of marge op de HTML-pagina kunnen aanpassen p of h1 tags, maar helaas ondersteunt Flash geen enkele CSS-stijl voor verticale uitlijning tussen alinea's. De beste oplossing die we hebben, is om een ​​nieuwe CSS-stijl te maken, alleen voor regelafstand. Doe open styles.css en voeg de volgende stijl toe:

 br6 font-size: 6; 

Update content.xml met een leeg BR6 stijl tag.

 ]]>

En nu is de regelafstand tussen de kop en alinea-uitlijning subtiel verbeterd.


Stap 17: Voorkom de Scrolling Bug

Open de SWF en klik en sleep naar beneden terwijl u de tekst selecteert. U merkt misschien dat er iets ongewoons gebeurt. De bovenste regel van onze kop is verdwenen. Als u omhoog sleept, verschijnt het weer. Op Windows-machines ziet u hetzelfde effect optreden als u de muisaanwijzer over de tekst beweegt en het muiswiel in een browser schuift.

De oplossing hiervoor, met dank aan de blog Vernietiging vandaag, is autosizing uitschakelen nadat de tekst erin is gewijzigd. Update eerst de setHTML () methode, en dan onImageAdded ().

 openbare functie setHTML (htmlText: String): void htmlTextField.autoSize = TextFieldAutoSize.LEFT; htmlTextField.width = blockWidth; htmlTextField.styleSheet = textStyleSheet; htmlTextField.htmlText = htmlText; var loader: Loader = htmlTextField.getImageReference ("image") als Loader; if (loader) // gebeurtenislistener toevoegen voor wanneer het htmlTextField de grootte van de afbeelding htmlTextField.addEventListener (Event.CHANGE, onImageAdded) wordt gewijzigd;  else // er is geen afbeeldingsreferentie, dus zet autosize uit htmlTextField.autoSize = TextFieldAutoSize.NONE;  persoonlijke functie onImageAdded (event: Event): void // toegang tot de afbeelding van de afbeeldingsreferentie in het tekstveld var loader: Loader = htmlTextField.getImageReference ("image") als Loader; var afbeelding: DisplayObject = loader.content; // pas de x-positie van de afbeelding aan om hspace image.x - = 5 te compenseren; // zet autosize uit htmlTextField.autoSize = TextFieldAutoSize.NONE; 

Publiceer opnieuw en u zult zien dat onze bugfix een nieuw probleem heeft gecreëerd.

Nu is de hoogte van het tekstveld niet groot genoeg om alle tekst weer te geven en zijn de onderste twee regels niet zichtbaar. We zullen dit in onze volgende stap oplossen.


Stap 18: De hoogte van het TextField aanpassen

Om alle tekst zichtbaar te maken, moeten we de hoogte van verhogen HTMLTextField. Als we de hoogte eenvoudigweg met 50 pixels vergroten nadat de afbeelding is toegevoegd, is het probleem opgelost.

 htmlTextField.height + = 50;

Deze oplossing voelt echter niet goed. Wat als we een afbeelding met een andere grootte gebruiken? Verschillende lettertypen of styling? De beste manier om het probleem aan te pakken is de hoogte dynamisch aan te passen, op basis van de waarden die Flash gebruikt om de hoogte te bepalen. De voor de hand liggende tactiek zou zijn om de tekst hoogte parameter. Laten we het proberen.

 htmlTextField.height = htmlTextField.textHeight;

Dat is beter, maar de onderste regel van de tekst is nog steeds verborgen. Bij enig onderzoek (bijvoorbeeld deze blogpost) kunnen we vaststellen dat er twee waarden aan de hoogte moeten worden toegevoegd. De ene is de hoogste leidend waarde van de tekststijlen die we gebruiken. In dit geval zou dat zijn 4 (van de p stijl). De andere waarde is htmlTextField.maxScrollV. Als we het totaal van die waarden, plus een veiligheidsaanpassing van 2 pixels, toevoegen aan de hoogte, HTMLTextField heeft de juiste grootte, ongeacht welke lettertypen, stilering of afbeeldingen worden gebruikt. In plaats van dit in te doen onImageAdded (), maak een nieuwe functie om de hoogte van het tekstblok te vergrendelen.

 private function onImageAdded (event: Event): void // toegang tot de afbeelding van de afbeeldingsreferentie in het tekstveld var loader: Loader = htmlTextField.getImageReference ("image") als Loader; var afbeelding: DisplayObject = loader.content; // pas de x-positie van de afbeelding aan om hspace image.x - = 5 te compenseren; // vergrendel de hoogte van het tekstveld om te voorkomen dat het vergrendelingsmechanisme wordt verschoven. Hoogte ();  private functie lockHeight (): void // zet autosize uit htmlTextField.autoSize = TextFieldAutoSize.NONE; htmlTextField.height = htmlTextField.textHeight; // hoogte-aanpassing // eerst doorloop StyleSheet-stijlen om de hoogste beginwaarde te verkrijgen var highestLeading: int = 0; voor elk (var-stijl: String in textStyleSheet.styleNames) var leading: int = int (textStyleSheet.getStyle (style) .leading); if (highestLeading < leading) highestLeading = leading;  // now, get the value of the height adjustment var heightAdjust:int = htmlTextField.maxScrollV + highestLeading + 2; htmlTextField.height += heightAdjust; 

De setHTML () methode moet ook worden bijgewerkt. Wanneer er geen inline-afbeelding in het tekstblok wordt geladen, moet de hoogte worden vergrendeld.

 openbare functie setHTML (htmlText: String): void htmlTextField.autoSize = TextFieldAutoSize.LEFT; htmlTextField.width = blockWidth; htmlTextField.styleSheet = textStyleSheet; htmlTextField.htmlText = htmlText; var loader: Loader = htmlTextField.getImageReference ("image") als Loader; if (loader) // gebeurtenislistener toevoegen voor wanneer het htmlTextField de grootte van de afbeelding htmlTextField.addEventListener (Event.CHANGE, onImageAdded) wordt gewijzigd;  else // er is geen afbeeldingsreferentie, vergrendel de hoogte van het tekstveld lockHeight (); 

Met deze laatste aanpassingen is alle tekst nu zichtbaar en scrolt niet.


Stap 19: voeg Custom TextEvent Link toe

Onze laatste taak in deze zelfstudie is om een ​​tekstlink toe te voegen die het formaat van het tekstblok verkleint. Om dit te doen, moeten we eerst de link naar de HTML-tekst toevoegen in de content.xml het dossier.

   Resizable, HTML-geformatteerd TextField met Runtime-lettertype inbedden & CSS-styling  

Dit is een voorbeeld van een tekstveld met een inline-afbeelding. De tekst is geladen vanuit een xml-bestand en is gestileerd met een externe CSS-stylesheet. De lettertypefamilie Droid Serif, waarnaar wordt verwezen door de CSS, is tijdens runtime geladen. De beschikbare stijlen voor Droid Serif zijn stoutmoedig, cursief en vet cursief. Droid Serif is gemaakt door Steve Matteson. Het koplettertype Lobster is gemaakt door Pablo Impallari.

We kunnen gebeurtenissen aan tekstlinks toevoegen. Verhoog of verlaag bijvoorbeeld de breedte van het tekstveld.

]]>

Stap 20: voeg TextEvent Listener toe

In onze HTMLTextBlock klasse, voeg een gebeurtenislistener toe om te detecteren wanneer op een tekstlink wordt geklikt. Importeer eerst het TextEvent klasse.

 import flash.events.TextEvent;

Voeg in de constructor de gebeurtenislistener toe.

 htmlTextField.addEventListener (TextEvent.LINK, textLinkHandler);

Maak nu de gebeurtenishandlermethode.

 private function textLinkHandler (event: TextEvent): void trace (event.text); 

Publicatievoorbeeld uitvoeren. Wanneer u op de links naar tekstgebeurtenissen klikt, ziet u een van beide increaseWidth of decreaseWidth in het uitvoerlogboek.


Stap 21: voeg functie toe om de breedte te wijzigen

Maak een nieuwe methode die de breedte van zal veranderen htmlTextField.

 private function changeWidth (newWidth: int): void blockWidth = newWidth; // ontgrendel de hoogte van het tekstveld htmlTextField.autoSize = TextFieldAutoSize.LEFT; // verander de breedte htmlTextField.width = blockWidth; // vergrendel de hoogtevergrendelingHoogte (); 

Stap 22: werk de tekstlink-handler bij

Werk de tekstkoppelingshandler bij om te bellen changeWidth ().

 private function textLinkHandler (event: TextEvent): void if (event.text == "increaseWidth") changeWidth (blockWidth + 10); if (event.text == "decreaseWidth") changeWidth (blockWidth - 10); 

Door te klikken op de tekstlinks verhogen / verlagen wordt nu de breedte van het tekstblok met 10 pixels aangepast.


Conclusie

Zoals te zien is in de zelfstudie, kan het gebruik van HTML-opgemaakt CSS-gestileerde inhoud in Flash moeilijker zijn dan het op het eerste gezicht lijkt. Nu we de basis hebben geleerd, kunt u deze kennis toepassen in uw eigen projecten. Hier zijn enkele suggesties voor verdere ontwikkeling:

  • Gebruik code uit de zelfstudie om bouwstenen voor Flash-sites en componenten te maken.
  • Breid het HTMLTextBlock uit om eigenschappen van het CSS Box Model op te nemen.
  • Laad, parse en toon HTML geladen van externe bronnen, zoals een RSS-feed.
  • Door ze gescheiden te houden van het Flash-document, kunt u de inhoudsitems gebruiken om niet-Flash-sites en -toepassingen te bouwen, zoals voor de iPad of iPhone.

Bedankt voor het lezen van deze tutorial en ik hoop dat je deze nuttig zult vinden in je toekomstige Flashing!