PDA

Volledige versie bekijken : Gebruik van alpha op systeem lettertype


TheDutch
%Europe/Berlin %351 %2008, 09:26
Het is niet mogelijk om in Flash een alpha neer te zetten voor een systeem lettertype omdat deze geen alpha channel bevat. De manier om dit toch voor elkaar te krijgen is het embedden van het font zodat deze als bitmap neergezet kan worden zodat er wel een alpha channel bestaat.

Echter is er ook een meer eenvoudige manier om dit voor elkaar te krijgen, een manier die de grootte van de SWF niet enorm verhoogt door het toevoegen van het systeem lettertype of delen ervan. Deze manier is zo eenvoudig als het toevoegen van een filter en eigenlijk is dat alles wat je moet doen.

Wanneer je een filter toepast op een display object dan wordt van dat display object een bitmap gemaakt. Een bitmap heeft een alpha channel dus je kunt er een alpha waarde op neerzetten. Voorbeeld:

var mijnTekst:TextField = new TextField();
mijnTekst.filters = [new BlurFilter(0,0,0)];
mijnTekst.alpha = 0.5;

Je zult nu zien dat de alpha van de tekst op 50% staat. Dit kan trouwens op elk display object worden toegepast :).

Aeronobe
%Europe/Berlin %697 %2008, 17:44
hartelijk dank!
ik vroeg me al af hoe ik mijn grootte van mijn bestand zou kunnen verminderen,
en het font nam veel plek in beslag. :)

appelkoek
%Europe/Berlin %401 %2008, 10:38
inzaga

Aeronobe
%Europe/Berlin %809 %2008, 20:25
Ik heb dit in een vorig project gebruikt, en toen lukte het mij.
Nu wil ik deze methode echter opnieuw gebruiken maar het lijkt mij niet meer te lukken... :s

Zou je aub een iets meer gedetailleerde uitleg kunnen geven om deze methode te gebruiken ?

Jan
%Europe/Berlin %529 %2008, 13:42
Het werkt zoals het daar staat. Meer is er ook niet aan.
Als je het in AS2 wil doen:
import flash.filters.*
mijnTekst.filters = [new BlurFilter(0,0,0)];
mijnTekst._alpha = 50;

Groeten,
http://users.telenet.be/jansurf/cwo.png Jan

Aeronobe
%Europe/Berlin %820 %2008, 20:40
Aaah,

Als je het in AS2 wil doen: import flash.filters.*

Dat ontbrak eraan. :)

ApplePI
%Europe/Berlin %569 %2009, 14:40
Volgens mij kan het nog eenvoudiger:

// AS3 code
var mijnTekst:TextField = new TextField();
mijnTekst.cacheAsBitmap = true;
mijnTekst.alpha = 0.2;
mijnTekst.text = "Alpha test";
//
this.addChild(mijnTekst);

groet,
ApplePI

ORay
%Europe/Berlin %083 %2009, 02:59
cacheAsBitmap werkt denk ik niet

ditwel, en ik denk dat het lichter is dan de filter
var tf:TextField = new TextField();
tf.text = 'test';
var bmd:BitmapData = new BitmapData(tf.width, tf.height, true, 0);
var bmd.draw(tf);
var bm:Bitmap = new Bitmap(bmd);
bm.alpha = .8;fouten voorbehouden (zo ff snel uit mijn hoofd)
maar dan moet je wel elke keer weer opnieuw de bitmapdata tekenen als je de tekst wilt veranderen

TheDutch
%Europe/Berlin %307 %2009, 08:23
ik denk dat het lichter is dan de filter


maar dan moet je wel elke keer weer opnieuw de bitmapdata tekenen als je de tekst wilt veranderen
Dus is het niet lichter dan de filter :P.

Ea.Z
%Europe/Berlin %630 %2009, 16:08
Lijkt me wat raar Erwin... Hoe gaat dat dan met de blurfilter?
Gezien het resultaat daarna toch ook een bitmap is (en die moet geupdate worden, als de tekst geupdate wordt... anders klopt er iets niet)... Hoe werkt dat dan?

mknol
%Europe/Berlin %326 %2009, 08:50
Elk filter dat in Flash gebruikt wordt, is intern een bitmap met daarop het filter toegepast. Het is dus (lijkt mij) niet nodig om dit zelf te doen, omdat dit teveel moeite is en denk ik ook meer resources gebruikt. Als je zelf een bitmap van maakt moet je 2 nieuwe instances maken; nl een Bitmap en een BitmapData object en deze nog toevoegen aan de displaylist en de oude textfield moeten removen. Eigenlijk zou een cacheAsBitmap=true al moeten voldoen, maar dit werkt domweg niet.

Eigenlijk is het een bug in de FlashPlayer dat systeem lettertypes niet alpha-tweenen. Maar dit is ook weer te verklaren; Als je in je OS hebt aangegeven dat je wel/niet clear-type gebruikt, dan is dit ook zo in de flashplayer. Ik denk dus dat je deels je OS-textrendering gebruikt en dat het daardoor iets meer buggy is.

TheDutch
%Europe/Berlin %326 %2009, 08:50
Mijn gedachten was meer low-level en waarschijnlijk beter geoptimaliseerd dan een higher-level API zoals de BitmapData class.

Echter heb ik zojuist een benchmark uitgevoerd voor beide situaties waarbij elke enter frame (met een max. van 50 keer) een tekst gegenereerd werd van 10.000 karakters. De filter deed er 4:23 minuten over en de BitmapData/Bitmap 4:24, je kunt het gelijkspel noemen.

Er is dus geen verschil in snelheid om filter of bitmap te gebruiken. In dat geval lijkt een filter mij de makkelijkste implementatie :).

mknol
%Europe/Berlin %973 %2009, 00:22
Goed bezig! Aan deze resultaten hebben we wat. Qua makkelijkheid is een filter simpelweg supersnel te maken en te onderhouden. Toch verbaast het me wel een beetje dat het ongeveer even snel is; dat had ik niet verwacht. Best leuk, zulke testjes.