Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 12-10-2003, 11:01   #1 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
Post .:workaround Teil 2:. Fonts dynamisch Nachladen

So hier nun eine weiter Endwicklung des "Load Font Workarounds" hier der Link zur ersten Version.

Für jene die sich Fragen um was es hierbei geht bzw. wo der Sinn oder nutzen liegt sollten
den oberen Link Folgen denn dort ist es genau erklärt.

Bei Version 2 ging es mir vor allem um die einfache Verwendung und das nahtlose einfügen in bestehende
as Strukturen, und das ist mir auf Basis einer einfachen Grund Idee wie ich meine sehr gut gelungen.
Das größte Problem war ja die Lade Zeit an sich und das man daher nicht gleich mit dem Textfeld
arbeiten konnte wie es z.b. möglich ist wenn man eines per createTextField erstellt.
Das ist nun aber alles möglich... das Grund Prinzip ist ganz einfach:
Es wird ein ganz normales Textfeld erstellt mit allen Einstellungen die notwendig sind....
wie die Text Probertys, textFormat und der text selber.
Erst dann wird eine spezielle Methode aufgerufen die eine Erweiterung des TextField.prototype ist....
In der Methode passiert dann letzt endlich nix anderes wie das er die ganzen settings des Textfeldes
zwischenspeichert das Textfeld löscht.... dann das externe Textfeld mit dem eingebetteten Font ladet..
und an hand der settings genau konfiguriert....

Ich glaube der Vorteil dieses Weges wird schnell klar, man muss sich keine Gedanken mehr über Ladezeiten machen....
Es gibt nun ganz wenige Anforderungen wo es noch Probleme geben kann....
Wenn man z.b getTextExtent oder textWidth bzw. mit autoSize arbeitet wo ja der Font durch die laufweite
eine große rolle spielt. Bekommt man natürlich nur die richtigen werte wenn das Textfeld zu 100% geladen ist..
Für diesen Zweck habe ich noch 3 Wege vorgesehen... zum einen den Event Handler "onLoad",
bzw. die abfrage loaded (true/false) und es ist auch noch möglich mit getBytesLoaded bzw. getBytesTotal zu arbeiten..

Hier nun zwei Beispiele wie man damit arbeiten könnte:
ActionScript:
  1. // ein normales textfeld erstellen
  2. this.createTextField("txtFeld", 1, 0, 0, 100 , 20);
  3. // einstellungen am textFeld vornehmen (es können alle gewohnten werte gesetzt werden)
  4. this.txtFeld.border = true;
  5. this.txtFeld.text = "Beispiel";
  6. // textFormat anlegen , es können alle werte bis auf "font" verwendet werden (was durch embedFont true logisch ist)
  7. var tf = new TextFormat();
  8.     tf.color = 0xff0000;
  9.     tf.size  = 14;
  10. // textFormat setzen
  11. this.txtFeld.setTextFormat(tf);
  12. // nun den Font(swf) laden (infos zu der methode loadFont + arguments gibt es im layer HILFE)
  13. this.txtFeld.loadFont("gaze.swf", 1);
  14. // fertig
  15.  
  16. //#########################################
  17. /* ::: INFO
  18.     alle TextFeld einstellungen die man nur auf ein TextFeld vornehmen kann sollten vor der methode loadFont eingestellt werden
  19.     da nach dem aufruf der methode erst wieder mit dem textFeld gearbeitet werden kann wenn dieses auch zu 100% geladen wurde.
  20.     Es gibt nun 3 wege dies zu prüfen,
  21.     - onLoad
  22.     - loaded
  23.     - getBytesLoaded u. getBytesTotal
  24.     alle Infos dazu im layer HILFE, und hier nun ein praktisches bsp.
  25. */
  26. this.createTextField("txtFeld2", 2, 0, 30, 100 , 20);
  27. this.txtFeld2.border = true;
  28.  
  29. this.txtFeld2.onLoad = function()
  30. {
  31.     // hier können nun wieder alle werte abgefragt bzw. gesetzt werden
  32.     this.text = "neuer text";
  33.     var tf = new TextFormat();
  34.         tf.color = 0x00ff00;
  35.         tf.size  = 14;
  36.     this.setTextFormat(tf);
  37.     //trace(this.textWidth)
  38. };
  39. // wichtig ist das die methode onLoad vor dem aufruf von loadFont definiert wird!!!
  40. this.txtFeld2.loadFont("gaze.swf", 2);
  41.  
  42. // ::: anwendungs beispiel von loaded und getBytesLoaded u. getBytesTotal
  43. this.onEnterFrame = function()
  44. {   
  45.     // die beiden werte sind nur interessant wenn man eine lade anzeige erstellen möchte
  46.     trace(this.txtFeld2.getBytesTotal());
  47.     trace(this.txtFeld2.getBytesLoaded());
  48.    
  49.     // ::: anwendungs beispiel für loaded
  50.     if (this.txtFeld2.loaded) // if true
  51.     {
  52.         trace("text Feld ist zu 100% geladen")
  53.         delete this.onEnterFrame;
  54.     }
  55. }

Und dies ist die Methode um die es letzt endlich geht
ActionScript:
  1. TextField.prototype.loadFont = function(urlFont, depth, propFlags)
  2. {
  3.     var str  = String(this);
  4.     var path = str.substr(0, str.lastIndexOf("."));
  5.     var name = str.substr(str.lastIndexOf(".")+1);
  6.     var owner = eval(path);
  7.     var txtFormat = this.getTextFormat();
  8.         txtFormat.font = null;
  9.     var txtProperty = {_width:this._width,_height:this._height,_y:this._y,_x:this._x,_rotation:this._rotation};
  10.     for (var i in this) if (i != "loadFont" && i != "embedFonts") txtProperty[i] = this[i];
  11.     this.removeTextField();
  12.     var mc = owner.createEmptyMovieClip("__"+name+"__", depth);
  13.     var tf = mc.createEmptyMovieClip("container", 1);
  14.     owner = { loaded:false };
  15.     owner.getBytesLoaded = function() { return tf.getBytesLoaded(); }
  16.     owner.getBytesTotal = function() { return tf.getBytesTotal(); }
  17.     tf.loadMovie(urlFont);
  18.     var loadControl = function()
  19.     {
  20.         if (tf.getBytesLoaded()>=tf.getBytesTotal() && tf.getBytesTotal()>10 && tf.tField != undefined)
  21.         {
  22.             eval(path)[name] = tf.tField;
  23.             tf.tField.getBytesLoaded = function() { return tf.getBytesLoaded(); }
  24.             tf.tField.getBytesTotal = function() { return tf.getBytesTotal(); }
  25.             for (var i in txtProperty) tf.tField[i] = txtProperty[i];
  26.             tf.tField.setTextFormat(txtFormat);
  27.             tf.tField.loaded = true;
  28.             if (tf.tField.onLoad != undefined) { tf.tField.onLoad(); }
  29.             if (propFlags == undefined || !propFlags) ASSetPropFlags(TextField.prototype, null, 1, 0);
  30.             clearInterval(si);
  31.         }
  32.     };
  33.     var si = setInterval(loadControl, 1);
  34. };
Im Anhang findet Ihr das Fla.. wo auch die bsp. zu finden sind, und eine kleine HILFE zu den einzelnen Punkten....
auch das gaze.fla (Font "gaze") ist dabei.....
Angehängte Dateien
Dateityp: zip loadfont.zip (35,0 KB, 317x aufgerufen)
__________________
Das Gesetz des Lebens liegt im Notwendigen. Der Reiz des Lebens liegt im Überflüssigen
m.f.g Scrawer (www.thinkspace.at)
Scrawer ist offline   Mit Zitat antworten
Alt 12-10-2003, 11:35   #2 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Schöne Idee. !

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 24-11-2003, 13:04   #3 (permalink)
Neuer User
 
Registriert seit: Sep 2001
Ort: Berlin
Beiträge: 276
Hallo...

Hat sich da eigentlich bei Flash2004 was verändert, oder ist dieser workaround auch für die neue Version "gültig" bzw. nötig?


Gruss
zirkumflex
zirkumflex ist offline   Mit Zitat antworten
Alt 24-11-2003, 22:55   #4 (permalink)
::: codeslinger :::
 
Benutzerbild von L4M4R
 
Registriert seit: Apr 2003
Ort: schweiz
Beiträge: 725
da ich's leider noch nicht testen konnte frag ich einfach mal ich hoffe mich schlägt nun keiner

Frage: D.h. also die Font wird dynamisch in den Movie nachgeladen und ist danach im ganzen Movie verfügbar? Also auch in statisch-dynmaischen Textfeldern die nicht über createTextField erstellt wurden?
__________________
Am Anfang schuf Gott das Advanced Research Projects Agent Network, dass auf den Namen ARPAnet getauft wurde, und das ARPAnet wuchs und gedieh und zeugte das Milnet, und das ARPAnet und das Milnet zeugten das Internet, und das Internet und seine Nachkommen, USENET Newsgroups und das World Wide Web, wurden zu einer Dreifaltigkeit, die das Leben seines Volkes für alle Zeiten grundlegend veränderte. L4M4R
L4M4R ist offline   Mit Zitat antworten
Alt 26-11-2003, 01:51   #5 (permalink)
anyway
Gast
 
Beiträge: n/a
hehe...cool das solche Threads zwischendurch mal wieder nach oben geschoben werden und man sie dadurch nochmal zu lesen bekommt..

Sehr schönes Dingen, scrawer...Ich hatte vor kurzem etwas ähnliches gebastelt, allerdings mit dem Nachladen eines MovieClips, der das dyn-Textfeld mit dem Font enthielt, wobei der containermovieclip nach außen hin vorgaukelte, ein Textfeld zu sein..

lustiges Dingen...ich werds mal die Tage überarbeiten und posten..

Bis dahin dankt das Haus...

anyway.
  Mit Zitat antworten
Alt 28-11-2003, 13:36   #6 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
@zirkumflex, klar ist as 1.. und geht auch unter flash7 framework

@ sncpp | lama, nein, du kannst es nur bei ein dynamisch erzeugtes textfeld einsetzen, infos warum wieso usw.. stehen ansich in der hilfe.. bzw im posting

@anyway, jep ist so man kann die grund idee aufgreifen und für vieles einsetzen
__________________
Das Gesetz des Lebens liegt im Notwendigen. Der Reiz des Lebens liegt im Überflüssigen
m.f.g Scrawer (www.thinkspace.at)
Scrawer ist offline   Mit Zitat antworten
Alt 28-11-2003, 14:03   #7 (permalink)
Neuer User
 
Registriert seit: Sep 2001
Ort: Berlin
Beiträge: 276
Also sind solche workarounds bei Flash7 (sorry hab mich damit immer noch nicht richtig beschäftigt) immer noch notwendig... Hmmm.
Aber das ist wohl sicherlich in einem anderen Thread schon ausgiebig diskutiert worden...

Gruss
zirkumflex
zirkumflex ist offline   Mit Zitat antworten
Alt 26-01-2004, 15:04   #8 (permalink)
tlp
Neuer User
 
Registriert seit: Oct 2002
Beiträge: 4
Hi,

erst einmal alle daumen hoch, es ist doch erstaunlich wieviel arbeit sich einer macht um sein wissen weiterzugeben...
Danke.

Irgendwie hab ich aber probleme wenn ich mein fla teste und simulate Download benutze werden die text felder nicht gefüllt gibts da irgend ne erklärung? oder habt ihr das problem nicht???

komm irgendwie nicht weiter danke für jede hilfe.

Gruss Timo aus DK
tlp ist offline   Mit Zitat antworten
Alt 26-01-2004, 23:22   #9 (permalink)
.
 
Benutzerbild von SunboX
 
Registriert seit: Sep 2002
Ort: Auerbach / Mittweida
Beiträge: 912
Thumbs up

nice

Ciao SunboX
__________________
..:: mein weblog ::.. ..:: meine homepage ::.. ..:: VisualDRUGS ::..
Zitat:
Geschrieben von emax
iterativ arbeiten ist menschlich, rekursiv dagegen göttlich :D
Künstliche Intelligenz ist leichter zu ertragen, als natürliche Dummheit!
SunboX ist offline   Mit Zitat antworten
Alt 13-02-2004, 13:23   #10 (permalink)
Neuer User
 
Benutzerbild von andilab
 
Registriert seit: Jun 2001
Ort: münster
Beiträge: 162
Thumbs up schön

und sehr nützlich
denk ich. nach sowas such ich grad. habs noch nicht ausprobiert, aber find ich jetzt schon gut. gute idee scrawer.
-.-

p.s.:
hallo. man kann anscheinend doch die tiefe eines mc oder textfeldes auslesen..

ActionScript:
  1. this.createTextField("txt2",5,23,23,122,22);
  2. trace(txt2.getDepth())// "5"
  3. this.createEmptyMovieClip("mc2",8);
  4. trace(mc2.getDepth())// "8"
  5.  
das hier funkitoniert auch:
ActionScript:
  1. TextField.prototype.loadFont = function(urlFont, depth, propFlags)
  2. {
  3.     depth = this.getDepth();
  4.          ....

Geändert von andilab (13-02-2004 um 16:53 Uhr)
andilab ist offline   Mit Zitat antworten
Alt 30-06-2004, 15:04   #11 (permalink)
a.k.a maddin79
 
Benutzerbild von madflanderz
 
Registriert seit: Jul 2003
Ort: berlin f-hain
Beiträge: 1.693
hallihallo,

ich probier schon ne weile rum, aber raffs nicht -

WIE können mehrere fonts für ein textfeld geladen werden??? ich möcht nähmlich auch bold darstellen und dazu benötige ich den normalen font sowie die dazugehörige bold-version.
madflanderz ist offline   Mit Zitat antworten
Alt 01-07-2004, 08:35   #12 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
Fett und Normal in einem dynamischen TextFeld mit eingebetteten Fonts geht nicht, so weit ich mich erinnern kann, hat aber nix mit dem Script zu tun, sondern Flash kann das nur bei StatischenTextfeldern, bzw mit SystemFonts geht es auch bei dynamischen......
So weit ich das sagen kann hat sich daran auch mit Flash7 nix geändert, aber nimm das nicht als gesetz hin, denn 100% sicher bin ich mir dabei nicht und mit dem Thema hatte ich schon länger nix mehr zu tun, aber was ich mich grau erinnere habe ich es in der Form auch nie hinbekommen, auch nicht über setTextFormat mit anfang-ende/index oder htmlText <b>usw....
__________________
Das Gesetz des Lebens liegt im Notwendigen. Der Reiz des Lebens liegt im Überflüssigen
m.f.g Scrawer (www.thinkspace.at)
Scrawer ist offline   Mit Zitat antworten
Alt 01-07-2004, 08:46   #13 (permalink)
a.k.a maddin79
 
Benutzerbild von madflanderz
 
Registriert seit: Jul 2003
Ort: berlin f-hain
Beiträge: 1.693
na toll :-(

ich dachte immer geht nich gibts nich, aber dank macromedia is soo vieles (nicht) möglich :-)
madflanderz ist offline   Mit Zitat antworten
Alt 07-07-2004, 13:46   #14 (permalink)
Neuer User
 
Benutzerbild von andilab
 
Registriert seit: Jun 2001
Ort: münster
Beiträge: 162
ich glaube mal gelesen zu haben, dass wenn du bold und normal zusammen in einer schrift hast (also bei bold einfach nur "B" angeklickt, kein eigener bold-schriftschnitt) es mit bold-text in dynamischen textfeldern auch klappt, wenn du einfach zwei (leer)zeichen ins textfeld einfügst und eines davon als bold markierst.
ja, ja..
andilab ist offline   Mit Zitat antworten
Alt 07-07-2004, 16:33   #15 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
Zitat:
Zitat von andilab
wenn du einfach zwei (leer)zeichen ins textfeld einfügst und eines davon als bold markierst.
ja, ja..
geht leider auch nicht... das geht nur bei statischen TextFeldern, bei einem dynamischen, wo du Zeichen einbettest, und dann versuchst was in das TextFeld zu schreiben (was ja geht), und von dem geschriebenen dann ein Zeichen markierst und auf Fett stellst.
Setzt Flash in dem Moment alle anderen Zeichen im TextFeld auch auf Fett bzw. umgekehrt.
__________________
Das Gesetz des Lebens liegt im Notwendigen. Der Reiz des Lebens liegt im Überflüssigen
m.f.g Scrawer (www.thinkspace.at)

Geändert von Scrawer (07-07-2004 um 16:37 Uhr)
Scrawer ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele