Carregando uma fonte somente se ela não estiver instalada no

Este processo comecei a pensar quando um cliente meu não tinha a fonte Arial instalada e tudo que dependia dela não aparecia. A segunda utilidade é economizar banda, pois as fontes normalmente consomem muito espaço do SWF quando embutidas. para que carregar uma fonte se a mesma já esta no Cliente?

Então, um pouco de pesquisa montei a classe FontUtil, que possui somente um método, registerFont que invocamos para passar a fonte, e o caminho da conte compilada.

Então primeiro vou criar um arquivo CSS com o nome de Calibri.css com o seguinte conteúdo.

/* CSS file */

@font-face {
  fontFamily: Calibri;
  fontWeight: bold;
  fontStyle: normal;
  src: local("Calibri");
}
A fonte Calibri esta presente em todas as maquinas Vista ou superior.

Agora marcaque este css para ser compilada como swf, conforme imagem abaixo.

Agora na pasta bin-debug foi gerado um arquivo Calibri.swf. Então vamos verificar se a fonte esta ou não instalada no computador, antes de importar. Para isso criei a classe FontUtil conforme abaixo.

package com.eduardokraus.text
{
  import flash.text.Font;
  import mx.styles.StyleManager;

  public class FontUtil
  {
    public static function registerFont( font:String, src:String ):void
    {
      var fonts:Array=Font.enumerateFonts( true )

      for ( var i:uint=0; i < fonts.length; i++ )
      {
        if (( fonts[ i ] as Font ).fontName == font )
          return;
      }
      StyleManager.loadStyleDeclarations( src );
    }
  }
}

Agora no createComplete do Application chamamos assim

FontUtil.registerFont( "Calibri", "assets/Calibri.swf" );

A classe irá fazer o seguinte. Varrer todas as fontes instaladas e se não achar a mesma instalada, irá fazer o download do SWF.

Veja abaixo uma aplicação funcionando com esta classe Util.

Código fonte aqui.

Fique por dentro de nossas novidades, ideias e atualizações