0

いくつかのフレーズを翻訳するために、フラッシュ (および Android および最終的には iOS 用の AIR) を使用するプロジェクトがあります。ほとんどのフォントは問題ありませんが、ユーザーが言語を選択した後に読み込む必要があるフォントもあります。1 年以上前に、いくつかの swf ファイル (ベンガル語とウルドゥー語) を生成し、Web サーバーに配置しました。必要に応じてフラッシュアプ​​リケーションがそれらをロードし、すべて問題ありません...しかし、プロジェクトの実装に近づいているため、パイプラインにある他の言語のswfファイルを生成する必要があると考えましたが、何らかの理由でそれを管理できません! 言うまでもなく、作成した 2 つのフォントの元の AS3 ソースを置き忘れました (整理しました)。

package   
{  
    import flash.display.Sprite;  
    import flash.events.Event;  
    public class ArabicF extends Sprite   
    {       
        [Embed(source = "trado.ttf",
        fontName = "ArabicX",
        fontFamily = "ArabicY",
        fontWeight = "normal",
        fontStyle = "normal",
        mimeType = "application/x-font",
        advancedAntiAliasing="true",
        embedAsCFF="true")]  
        public static const ArabicZ:Class;  
    }   
}  

これを機能させるために追加したので、これははるかに単純な形式から拡張され、true と false のすべての順列を試したに違いありません。swf を正常にロードしましたが、クラスを抽出できません。swf クラスとパラメーターの前に埋め込んだ 2 つのフォントはすべて同じ名前で、正常に動作します (つまり、Urdu.swf の場合は後で: var FontClass:Class = evt.target.applicationDomain.getDefinition("Urdu") as Class; )。そして Font.registerFont(FontClass.Urdu);
上記の Arab.swf を使用した呼び出し元の .as アプリケーションで、試してみます

trace("1 Arabic "+evt.target.applicationDomain.hasDefinition("ArabicF"));  
trace("2 Arabic "+evt.target.applicationDomain.hasDefinition("Arabic"));  
trace("3 ArabicX "+evt.target.applicationDomain.hasDefinition("ArabicX"));  
trace("4 ArabicY "+evt.target.applicationDomain.hasDefinition("ArabicY"));  
trace("5 ArabicZ "+evt.target.applicationDomain.hasDefinition("ArabicZ"));  

しかし、すべてfalseを返します

PS はまた、fontswf.bat を使用して Arabic.swf を生成しようとしましたが、これはロードされた非常によく似た swf ファイルを作成するように見えますが、そこからクラスを抽出できません。

PPS 私は flashdevelop を使用しており、フォント swf は AS3 標準プロジェクト コンパイラ オプションとして設定されています。

4

2 に答える 2

2

私はFlashDevelopを使用していませんが、実装からいくつかの視点を提供できるかもしれません。


Arialを埋め込みたい場合、埋め込みswfは埋め込みフォントを「ActionScriptにエクスポート」します。そのドキュメントクラスでは、次のように使用registerFont()します。

Font.registerFont(Arial);

他のすべてのswfと同様に、を使用Loaderしてランタイムにインポートします。その時点で、フォントはグローバルテーブルで使用できるようになります。enumerateFonts()を使用して、登録されているフォントの完全なリストを照会できます。

var fontList:Array = Font.enumerateFonts();
for (var i:int = 0; i < fontList.length; i++) {
    trace(fontList[i].fontName);
}

「txt」というTextFieldがあるとすると、次setTextFormat()のようにそのフォントを実装できます。

var format:TextFormat = new TextFormat();
format.font = "Arial";
txt.embedFonts = true;
txt.antiAliasType = AntiAliasType.ADVANCED;
txt.setTextFormat(format);
txt.defaultTextFormat = format;

これらの最後の2つの設定の使用に関するAdobeからの免責事項:

"TextField.defaultTextFormatプロパティまたはTextField.setTextFormat()メソッドを使用してTextFormatオブジェクトをテキストフィールドに適用すると、定義されたプロパティのみが適用されます。TextFieldにテキストを追加する前に、TextField.defaultTextFormatプロパティを使用してフォーマットを適用してください。また、テキストをTextFieldに追加した後、setTextFormat()メソッドを使用してフォーマットを追加します。」

前に述べたように、私のワークフローではFlash Developを使用せず、FlashIDEを使用してフォントをswfsに埋め込みます。結果は異なる場合がありますが、trueに設定する必要があることに注意してembedFontsください。そうしないと、埋め込みフォントに応答しません。私は前にその問題で髪を失ったことがあります。

お役に立てば幸いです。乾杯、

于 2012-10-06T21:31:05.650 に答える
1

OK 他の誰かが同様の問題に遭遇した場合に備えて、これは答えの第 1 段階です (実際には私の元の質問に対する答えです)、flash.font.engine 装置で使用されるフォントを取得する方法を整理する必要があります。

重要な部分は次のとおりです。

ポイント#1。埋め込みフォント swf には、呼び出しスクリプトに登録されている名前と衝突しない名前が必要です。Bizzare で、(検索できる限り)文書化されていません。つまり、xml サービスを介して xml オブジェクトにアップロードされた言語のリストがあり、これにはたとえば「英語」が含まれていますが、読み込み可能なフォント ファイルを「EnglishF.swf」にするまでフォントの読み込みは機能しません。 English.swf' は失敗します。したがって、埋め込みフォント ソースは EnglishF.swf と呼ばれるようになり、次のようになります。

package 
{
import flash.display.Sprite;
import flash.text.Font;
import flash.system.Security;

Security.allowDomain("*");
/**
 * ...
 * @author patrick
 */
public class EnglishF extends Sprite 
{       
    [Embed(source = "Kingthings Exeter.ttf",
        fontName = "EnglishF",
        fontFamily = "EnglishF",
        fontWeight = "normal",
        fontStyle = "normal",
        mimeType = "application/x-font",
        advancedAntiAliasing="true",
        embedAsCFF="true")]
        public static var myFont:Class;
}   
}  

using スクリプトは次のようになります。

private function fontLoaded(evt:Event):void { 
        var FontClass:Class
        if (evt.target.applicationDomain.hasDefinition(font1Name)) FontClass = evt.target.applicationDomain.getDefinition(font1Name) as Class;
        else if (evt.target.applicationDomain.hasDefinition(font2Name)) FontClass = evt.target.applicationDomain.getDefinition(font2Name) as Class;
        try {
            Font.registerFont(FontClass.myFont);
            trace("successfully loaded " + FontClass);
        } catch (err:Error) { 
            trace("couldn't register font "+FontClass.myFont+" =>"+err);
        }
    }  

セキュリティに関する埋め込みスクリプトの行は、ポイント #2 によるものです。registerFont はドメイン間で機能しません。実際、Security.allowDomain() は機能せず、これをデバッグするには、PC に swf ファイルをコピーして貼り付け、それに応じて loader.load(URLRequest()) を変更する必要がありました。

フォントが登録されており、flash.text.engine の TextElement 要件と互換性があると主張しているにもかかわらず、次のように使用できないという問題がまだ残っています。

        _tl = new Array();

        var block:TextBlock = new TextBlock();
        var font:FontDescription = new FontDescription(fontName);
        var formt:ElementFormat = new ElementFormat(font, fontSize);
//following gives 'true EnglishF'
trace(FontDescription.isFontCompatible(fontName,"normal","normal"), formt.fontDescription.fontName);
        formt.color = colr;
        var span:TextElement = new TextElement(text, formt);
        block.content = span;

        _tl[0] = null;
        _tl[0] = block.createTextLine(null, width);
        var tl:TextLine;
// after here justification and addition lines  

これが機能しない理由を整理したら、何かを投稿します(親切な人が私のためにそれをしない限り!)

于 2012-10-09T19:32:19.603 に答える