ウィジェット カスタムフォント

ウィジェットでは、andophoneの画面上で、美しい非標準フォントでテキストを表示する必要がある状況に直面しました。 その瞬間からこの投稿が始まりました。



ウィジェットの開発は、 アクティビティの開発とは少し異なります。この「小さな」ことは、車輪を車輪に入れることもあります。 ウィジェットの開発については詳しく説明しませんが、 Habréにはこのトピックに関する素晴らしい投稿がすでにいくつかあります(たとえば、 Android向けのHello Worldウィジェットウィジェットの 作成、ウィジェットの作成など)。機能のみに焦点を当てます。



問題の本質


問題は、必要なビューの Typefaceプロパティのみ設定することで、 アクティビティでカスタムフォントを記述できることです。



Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Aliner.ttf"); TextView tv = (TextView) findViewById(R.id.txtFont); tv.setTypeface(tf);
      
      





しかし、ウィジェットではこれは機能しません。 RemoteViewsオブジェクトを介してのみビューに到達できるため、それほど大きな機会はありません。 また、いくつかの方法で値を変更することもできますが、「ビュー」にはそれほど簡単にアクセスできません。

  remoteView.setInt(R.id.widgetPNG, "setAlpha", 50); remoteView.setBoolean(R.id.a_text_view, "setSelected", true); remoteView.setCharSequence(viewId, "setText", "Hello World!"); .....
      
      





しかし、フォントの質問は開いたままです。



ソリューションはBitmapsを使用して見つかりました。



カスタムフォント接続


最初に必要なのは、私たちに合ったフォントを見つけて./assets/fonts/ディレクトリに置くことです:





さらに、ウィジェットコードで接続するだけです。

  Typeface tf = Typeface.createFromAsset(context.getAssets(),"fonts/Benegraphic.ttf");
      
      





テキストを画像に変換する


先ほど言ったように、 Bitmapで作業します。 テキストがあれば、次の方法でテキストを画像に変換できます。

  private Bitmap convertToImg(String text, Context context) { Bitmap btmText = Bitmap.createBitmap(400, 100, Bitmap.Config.ARGB_4444); Canvas cnvText = new Canvas(btmText); Typeface tf = Typeface.createFromAsset(context.getAssets(),"fonts/Benegraphic.ttf"); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setSubpixelText(true); paint.setTypeface(tf); paint.setColor(Color.WHITE); paint.setTextSize(50); cnvText.drawText(text, 150, 50, paint); return btmText; }
      
      





convertToImg()メソッドは、 Benegraphic.ttfフォントで記述されたテキストを含む既製の「ビットマップ」を返します。 ウィジェットにのみインストールできます。



ウィジェットに「テキスト」を追加する


生成されたビットマップをウィジェットにインストールするのは難しいことではなく、わずか3行のコードです。

  public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); remoteViews.setImageViewBitmap(R.id.imText, convertToImg("Hello World!", context)); appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); }
      
      





ここですべてのコーディングが終了します。 アプリケーションを起動し、デスクトップの1つにウィジェットをインストールすると、同様の画像が表示されます。





そこで、 Androidウィジェットにカスタムフォントを追加しました。



おわりに


1つの方法は、まだ問題を解決しました。 もちろん、これは解決策でしたが、もっとネイティブなものが欲しかったのです。 まだ方法があることを本当に願っていますが、悲しいかな、思いついたものも他のものも見つかりませんでした。 インターネット上の人々もこの質問をしますが、まだ答えを見ていません。 おそらくあなたの一人がすでに出くわしているかもしれませんが、コメントで聞くのは面白いでしょう:)



ここからプロジェクト全体をダウンロードしてください



All Articles