2017-10-03 13 views
0

私はネイティブのxamarin andoridで働いています。私はカスタムフォントを設定する問題に直面している。私はキャンバスビューを生成するために "SkiaSharp"プラグインを使用しています。そのプラグインはPCLの内部にあるので、アンドロイドとイオスの両方で使うことができます。アセットフォルダからフォントファイルのパスを取得する方法とそのパスを使用してxamarin androidのSKTypefaceを設定する方法は?

「資産」フォルダに1つの.ttfファイルがあります。

次のコードを使用してフォントパスを生成します。

string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
string FontPath = System.IO.Path.Combine(path, "Myfile.ttf"); 

私は"SKTypeface" に設定するPCLに送るこのパス

paint.Typeface = SKTypeface.FromFile(FontPath, 0); 

それは"書体"であるならば、私は

Typeface tf = Typeface.CreateFromAsset(Assets, "Myfile.ttf"); 

次のアプローチを使用することができます戻り値として常にnullのSKTypefaceを取得します。

フォントパスが見つかりません。

bool flag=File.Exist(FontPath) 

常にnull値を返します。

xamarin andoridでAssetフォルダのパスを取得するにはどうすればよいですか? カスタムフォントをSKTypefaceに設定する方法は?

+0

paint.Typeface = SKTypeface.FromFamilyName( "Arial");その作業しているがカスタムフォントは動作しません –

答えて

2

通常、アンドロイドアセットのパスはアプリパッケージ内にあるため、使用しないでください。むしろあなたはストリームを取得して、それをロードする - しかし、資産ストリームがシーク可能ではありませんので、彼らは最初にコピーする必要があります:

SKTypeface typeface; 
using (var asset = Assets.Open("Fonts/CONSOLA.TTF")) 
{ 
    var fontStream = new MemoryStream(); 
    asset.CopyTo(fontStream); 
    fontStream.Flush(); 
    fontStream.Position = 0; 
    typeface = SKTypeface.FromStream(fontStream); 
} 

... 
paint.Typeface = typeface; 

私はまた、あなたはおそらくしたいので、これは比較的「遅い」されていることをメモしておきたいですこれを一度やってから、書体を再利用してください。ペイントがUIスレッドで発生し、ブロックされるため、ペイントメソッドで直接ファイルを読み込まないようにします。

アセットを読み込むときは、ルート「アセット」フォルダは含めないでください。新しいv1.59.2リリースで

EDIT

予想通り、既存のFromStream方法に関係なく、ストリームの、動作します。

+0

返信ありがとうございますが動作していません。私はヌルストリームを持っています。 –

+0

私のフォントファイルはFontフォルダ内にあります。 Assets/Font/myfile.ttf –

+0

@RutulMehta私が最初に間違っていたので、私は答えを書き直しました。これはすばらしいコードではありません。SkiaSharpの次のバージョンでこれを修正します。 – Matthew

関連する問題