¿Quieres registrarte?

Fuentes en Flash como en CSS en AS3

Por: Otaku RzO
5 de Mayo del 2010

Esto es una actualización del tip Fuentes en Flash como en CSS en AS2, ahora veremos como se hace para AS3.

Código :

function getFont(list:Array, enumDeviceFonts:Boolean=false ):void 
{
    var have:Array = Font.enumerateFonts(enumDeviceFonts);
    for (var a = 0; a<list.length; a++) {
        for (var b = 0; b<have.length; b++) {
            if (list[a] == Font(have[b]).fontName ) {
                return list[a];
                break;
            }
        }
    }
    return '_sans';
}

Explicación

Lo único que hice para migrar fue cambiar "TextField.getFontList" por "Font.enumerateFonts". Pero el nuevo método para obtener las fuentes ahora tiene un parámetro que le indicará si queremos listar las Fuentes del Sistema o las Fuentes que tenemos Embebidas en la Librería.

Ejemplo de uso:

1. Fuentes del Dispositivo (estilo HTML)

  1. Colocar una caja de texto (TextField), en el escenario.
  2. Usar el siguiente código en el frame donde colocamos la caja de texto.

Código :

var _fontName:String = getFont(['Trebuchet MS','Arial','Helvetica'], true);
clab_txt.text = "This is Cristalab!";
clab_txt.setTextFormat( new TextFormat(_fontName, 12) );

2. Fuentes Embebidas

  1. Colocar una caja de texto (TextField), en el escenario.
  2. Agregar a la libreria 3 fuentes (Trebuchet MS,Arial,Helvetica), pueden colocarles el nombre que quieran y en las opciones de vinculación marque "Exportar para Actionscript".



  3. Luego usar el siguiente código en el frame donde colocamos la caja de texto.

Código :

var _fontName:String = getFont(['Trebuchet MS','Arial','Helvetica']);
clab_txt.text = "This is Cristalab!";
clab_txt.setTextFormat( new TextFormat(_fontName, 12) );
clab_txt.embedFonts = true;
Pueden ir probando usando otras fuentes para que noten los cambios cuando falte alguna fuente.

Como pueden ver en los 2 ejemplos de uso sólo cambio un parametro en getFont y se agrego embedFonts al texto.

 


También te interesa


Etiquetas flash css actionscript_3 tipografia

Comentarios | Enviar un comentario
es genial ver estos tips que actualizan al AS3 los anteriores en AS2 y demás... :)
Por: Mariux
D+ ! ya lo convierto a clase y lo meto al paquetón.

Gracias
Martín
Por: Martincho7
Muy buena funcion, siempre hacer eso era medio complicado. ^_^
Por: Gz.Francisco
Bueno, doy mi pequeño aporte...convertido a clase quedaría así:
Fuente.as

Código :


package {

   import flash.text.Font;



   public class Fuente {

      public function Fuente():void {   }

      

      public static function usar(list:Array, enumDeviceFonts:Boolean=false):String {

         var have:Array=Font.enumerateFonts(enumDeviceFonts);

         for (var a:int = 0; a<list.length; a++) {

            for (var b:int = 0; b<have.length; b++) {

               if (list[a]==Font(have[b]).fontName) {

                  return list[a];

                  break;

               }

            }

         }

         return '_sans';

      }

   }

}



Lo usamos así:

Código :


var _fontName:String = Fuente.usar(['Verdana','Arial'], true); 

clab_txt.htmlText = "This is Cristalab!"; 

clab_txt.setTextFormat( new TextFormat(_fontName, 24) );

clab_txt.embedFonts = true;



Saludos
Martín
Por: Martincho7
mmm, está bien... pero esto rompería el rendimiento de una app al hacer un for a TODO, ¿qué pasaría si tienes muchas fuentes embebidas o de sistemas?
Por: eldervaz

eldervaz-blog :

mmm, está bien... pero esto rompería el rendimiento de una app al hacer un for a TODO, ¿qué pasaría si tienes muchas fuentes embebidas o de sistemas?
¿Qué sugieres que se puede hacer para solucionarlo sin perder funcionalidad?
Por: Freddie
muchas cosas, a primera instancia y la más simple, es tener en un diccionario (o un array simple por último) las fuentes que TU embebes o vas a usar en tu app. no tienes porque recorrer las 5 mil fuentes de tu sistema si tu sabes cual realmente usarás.
Por: eldervaz
@eldervaz Para eso tienes la opción de embeber tus propias fuentes como en el ejemplo 2. Pero si es el caso de leer las fuentes del dispositivo hice un ligero cambio al script para mostrar cuando tiempo le toma al FlashPlayer leer todas las fuentes, aquí la muestra.

Código :

stage.scaleMode = flash.display.StageScaleMode.NO_SCALE;

function getFont(list:Array, enumDeviceFonts:Boolean=false ):String  
{ 
   var time:Number = getTimer();
    var have:Array = Font.enumerateFonts(enumDeviceFonts);
   clab_txt.text = 'Total Fonts: ' + String(have.length);
    for (var a:Number = 0; a<list.length; a++) { 
        for (var b:Number = 0; b<have.length; b++) { 
            if (list[a] == Font(have[b]).fontName ) { 
                clab_txt.appendText('\n-> Segundos: ' + String((getTimer()-time)/1000) );
            return list[a];
                break; 
            } 
        } 
    }
   clab_txt.appendText('-> Segundos: ' + String((getTimer()-time)/1000) );
    return '_sans'; 
}
// Uso "Verdana" primero ya que es una de las (casi) últimas fuentes.
var _fontName:String = getFont(['Verdana','Helvetica','Arial'], true);
clab_txt.setTextFormat( new TextFormat(_fontName, 12) );


En la PC del trabajo me muestra:
Total: 1610
-> Segundos: 0.03

En la PC de un diseñador del trabajo:
Total: 2861
-> Segundos 0.028

Como es diseñador su PC es más potente, si yo tuviera el doble de fuentes mi tiempo sería 0.06.

Según las pruebas el FlashPlayer es muy rápido para esta tarea, ni siquiera le toma medio segundo (0.5), y mejor si antes de nuestra aplicación llamamos una sola vez a esta función (o varias según los tipos de combinaciones de fuentes a usar), y usar el resultado a lo largo de la aplicación.

Ahora, lo que tu dices es cierto y se podría mejorar esta función si tuviesemos listadas todas las fuentes por defecto de cada sistema operativo (Windows, OSX, Linux, etc), y vemos cual array usar según nos diga flash.system.Capabilities.os .

Uds. decidan cual es la mejor forma ;) .
Por: Otaku RzO
PD: El exceso de fuentes en el sistema operativo hace que este se vuelva lento, incluso el Adobe Flash Professional se vuelve muy lento (o se cuelga), cuando intentas escoger alguna fuente para un texto y seguramente pasa en todo programa que intenta lista las fuentes con previsualización de las fuentes.
Recomendación: Administren sus fuentes con algun programa y quiten o separen las que ya no usan.
Por: Otaku RzO
no entendiste creo, no es tener todas las fuentes del sistema, si no las usadas por aplicación. De la misma forma, 0.6 segundos en una app es realmente un gasto innecesario.

^^ no digo que está mal, digo que ojo con eso, el rendimiento se puede ir al tacho.
Por: eldervaz

eldervaz-blog :

no entendiste creo, no es tener todas las fuentes del sistema, si no las usadas por aplicación.
Por eso te mencione lo de usar tus propias fuentes embebiendolas, sino no sabrías si un usuario tiene una fuente de las que quieres usar sin antes consultar sus fuentes instaladas.

eldervaz-blog :

De la misma forma, 0.6 segundos en una app es realmente un gasto innecesario.
Dije 0.06, no 0.6.

eldervaz-blog :

^^ no digo que está mal, digo que ojo con eso, el rendimiento se puede ir al tacho.
Te entendí desde el inicio y di algunas soluciones, pero esto último que pones es una buena nota.

Prueben las soluciones y formas de uso que mensione antes, hagan pruebas de rendimiento como en el de mi prueba, con más textos fuentes y, como dijo Elder, mucho cuidado con el rendimiento.
Por: Otaku RzO
Buena otaku!
estas digievolucionando (más por la sustentación del tip)
Por: juanjosehzgs
Ok, gracias por actualizar :D
Por: AzrL
Amm, pregunta tonta quizás... Al embeber una fuente en el *swf ¿para que necesitaríamos una segunda opción instalada en el sistema (tipo CSS)?, qué no basta con poner la fuente y ya.

Atentamente, confundido por la tipografía.
Por: M@U
muy buen tip y mejor los comentarios...saludos
Por: bubudrc
@M@U (que raro fue escribir tu nombre con doble arroba xD)
El resultado visualmente es el mismo si piensas usarlo de una forma, pero para los que aun usan el StyleSheet les sirve más.

Pero el mayor beneficio es el ahorro en el peso de tu SWF final.

Fuentes del Sistema: usando todas las fuentes que solicitemos -> 0kb
Fuentes embebidas: por fuente desde 32kb hasta 60kb, según el tipo de fuente.
Fuente embebida directamente: por cada caja de texto con los carácteres básicos -> 13kb a más.
Por: Otaku RzO
Estaba buscando algo parecido y no lo encuentro, aunque esto es casi lo que necesito...

Tu sistema esta muy bien, pero para cargar en lugar de:
clab_txt.text = "This is Cristalab!";

un archivo HTML? en el cual las etiquetas <p><h1> y demás funcionen y carguen los estilos de un .css

Creo que sería perfecto de esta manera, así se podrían hacer contenidos en flash como si de una pagina XHTML se tratase, sustituyendo claro esta los <div> por textareas..

¿Alguna idea, o algún sitio donde se pueda conseguir eso?


Muchas gracias.
Por: j4rk0r
La duda de M@U no me quedo clara.
La pregunta es que el swf desde un primer momento lleva embebida la tipografía, o sea, que el chequeo no va a influir a en el peso a menos que el resultado del mismo sea obtener la tipografia de una biblioteca compartida o de un swf externo...

O me estoy perdiendo de algo..

Creo que la forma de utilizar la funcion para que funcione como lo hace en css es no embeber nada y que se fije si la tipografia se encuentra en el sistema del usuario y en caso de no encontrarla busque la segunda y nuevamente en caso de no encontrarla muestre la tipografia por defecto.
Por: Daniel-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.