Xamarin.Formsでアイコンフォントを使えるようにする
アイコンフォントとは
アイコンのWebフォントです.フォントなのでテキストと同じようにサイズや色を変えることができます.
(雑)
上記のサイトを参考にしてアイコンフォントをXamarin.Formsで使えるようにします.
フォントの入手
以下のサイトからアイコンフォントを入手します.
このサイトでは選択したアイコンを.ttf
ファイルとして一括でダウンロードすることができます.
各アイコンを1つ1つクリックして選択していくか,もしくは以下のように矩形選択することができます.
選択したら右上の「Download webfont」をクリックしてダウンロードします.
詳しくはこちらのサイトでも説明されています.
zipファイルとしてダウンロードされるので,それを解凍します.
その中に.ttf
ファイルがあります.必要に応じてファイル名を変更します.
フォントファイルの配置
フォントファイルの配置場所と手順は各プラットフォームごとに異なります.
Android
プロジェクト直下のAssets
フォルダ内にダウンロードした.ttf
ファイルをコピペやドラッグ&ドロップなりなんなりで追加します.
追加したフォントファイルのプロパティを開いてBuild Action
をAndroidAsset
に設定します.
iOS
プロジェクト内のResources
フォルダ内に.ttf
ファイルを入れます.
そして,BuildAction
をBundleResource
に設定します.
info.plist
内に以下を追加します.
<dict> 省略 <!--これ--> <key>UIAppFonts</key> <array> <string>fontello.ttf</string> </array> <!--ここまで--> </dict>
UWP
/Assets/Fonts
フォルダに.ttf
ファイルを入れます.Assets
フォルダ内にFonts
フォルダを作成し,その中に入れます.
BuildAction
をContent
に設定します.
アプリケーションからアイコンフォントを使う準備
各プラットフォームごとに配置した.ttf
ファイルを参照するように以下の設定をApp.xaml
内の<Application.Resources>
内に以下を追加します.
<Application.Resources> <!-- ここから --> <OnPlatform x:Key="MyFontFamily" x:TypeArguments="x:String"> <On Platform="iOS" Value="My Icons" /> <On Platform="Android" Value="fontello.ttf#My Icons" /> <On Platform="UWP" Value="Assets/Fonts/fontello.ttf#My Icons" /> </OnPlatform> <!-- ここまで --> </Application.Resources>
iOSはinfo.plist
でファイルの位置を指定しているので,名前をつけているだけです.
AndroidとUWPではファイルの位置と名前をしています.
ここまででアイコンフォントを使用する準備が整いました.
アイコンフォントを使用する
それでは使ってみましょう.
<Label FontFamily="{DynamicResource MyFontFamily}" HorizontalOptions="Center" Text="こんにちは,絶対! " VerticalOptions="CenterAndExpand" />
この
の部分がアイコンフォントのコードになります.
このコードをどうやって知ればいいのかというと,方法はいくつかあります.
ひとつはダウンロード元のFontelloで以下のようにフォントを選択して「Customize Codes」というタブを開くと,各アイコンのコードをみることができます.
この例ではE804
がコードなので,Xaml上では
となります.
これで実行すると,以下のようにアイコンが表示されます.
フォントですので,FontSizeやTextColorといったプロパティで大きさや色を変更できるので便利です.
<Label FontFamily="{DynamicResource MyFontFamily}" FontSize="Large" HorizontalOptions="Center" Text="こんにちは,絶対! " TextColor="Red" VerticalOptions="CenterAndExpand" />
コードで指定するのはツライ...
コードでアイコンを指定するのはなかなかしんどいものがあります.
そこで,このコードに名前を
Icon font to Codeというウェブサービスがあります.これは.ttf
ファイルを読み込ませると,各アイコンに対応するコードとそのアイコン名の組み合わせからC#のクラスを生成するものです.
「Browse」ボタンを押して.ttf
ファイルを指定します.
すると,このようにC#コードが生成されるのでこれを早速クリップボードにコピーします.
共通プロジェクトにこのクラスを追加します.
これをXamlで使用する場合は,そのクラスにアクセスできるように名前空間を追加し,
(こういうやつ)
xmlns:local="clr-namespace:FontImageSourcePractice"
ラベルでもボタンでも単独で使うのであれば,
<Label FontFamily="{StaticResource MyFontFamily}" FontSize="Large" HorizontalOptions="Center" Text="{x:Static local:IconFont.Music}" TextColor="Red" VerticalOptions="CenterAndExpand" />
このようにx:Static
を使ってIconFontクラス内のプロパティを指定します.
このあたりの使い方はXappyのソースコードを参考にしました.
Text="{x:Static local:IconFont.Music}"
では文字列の中で部分的にアイコンフォントを使いたい場合は,最初の例のようにコードで書き込むか,今回の場合では以下のようにSpan
要素を使って部分ごとに分けて文字列を組み立てます.
<Label FontSize="Large" HorizontalOptions="Center" TextColor="Red" VerticalOptions="CenterAndExpand"> <Label.FormattedText> <FormattedString> <Span FontSize="Large" Text="こんにちは,絶対!" /> <Span FontFamily="{StaticResource MyFontFamily}" FontSize="Large" Text="{x:Static local:IconFont.Music}" /> </FormattedString> </Label.FormattedText> </Label>
アイコンフォントなので,最も多い用途はアイコンとしてでしょう.
ImageSource型のプロパティをコントロールが持っていれば,そこにFontImageSource
を使って設定することができます.
例えばボタンにアイコンをセットしてみます.
<Button Margin="20" BackgroundColor="Red" CornerRadius="50" HeightRequest="90" HorizontalOptions="Center" VerticalOptions="Center" WidthRequest="95"> <Button.ImageSource> <FontImageSource FontFamily="{StaticResource MyFontFamily}" Glyph="{x:Static local:IconFont.Heart}" Size="44" Color="LightGreen" /> </Button.ImageSource> </Button>
まとめ
このように一度プロジェクトに導入してしまえば後は簡単に使うことができ,とても便利です.
今回のソースコード
おまけ
さて,サンプルの文字列を「こんにちは,絶対」にしていたのは「糸へん」の漢字を表示させて中華フォントで表示されるのかを確認したかっただけです.
スクリーンショットはエミュレータで動作させたもので,糸へんの下部分が3つの点で書かれており,日本語フォントとは異なっていることがわかります.
なので,最後にフォントの指定方法を追記しようかなと思ったのですが,実機で動かしたら日本語フォントが使われました.
フォントの変更についてはまた別で書こうと思います.
手順概要
- フォントの入手(Fontelloなど)
- フォントファイルをプロジェクトに配置(プラットフォームごとに)
- フォントファイルからフォントのコードを取得(IconFont2Code)
- フォントファイルの位置を設定(プラットフォームごとに)(Application.Resources内で)
- StaticResourceとして利用