2011-01-02 13 views
0

テキストを表示するウィジェットを作成しています。ウィジェットとは、デスクトップ上にある種類を意味します。アンドロイドウィジェットのビットマップにTextViewをレンダリングする

問題は、実行時にテキストのフォントを変更したいということです。

private static Bitmap loadBitmapFromView(View v) 
{ 
Bitmap b = Bitmap.createBitmap(v.getLayoutParams().width, v.getLayoutParams().height,  Bitmap.Config.ARGB_8888); 
Canvas c = new Canvas(b); 
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height); 
v.draw(c); 
return b; 
} 

TextView tv = new TextView(context); 
tv.setText(stringToDisplay); 
tv.setTextColor(0xa00050ff); // example 
tv.setTextSize(30);   // example 

Bitmap b = loadBitmapFromView(tv); 
updateViews.setImageViewBitmap(R.id.id_of_the_imageview, b); 

:私はこれを思い付いたなど、私は大胆として最初に設定し、実行時に、希望のいくつかのTextView、例えば青とイタリック秒、

があります

私は250、50

Bitmap b = Bitmap.createBitmap(250, 50, Bitmap.Config.ARGB_8888); 
// ... 
v.layout(0, 0, 250, 50); 
01のような固定されたサイズによって v.getLayoutParams().width, v.getLayoutParams().heightを交換するまでは習慣、(loadBitmapの最初の行にNullPointerExceptionが)動作

しかし、それは良い解決策ではありません...

ので、私はこれを試してみました:

LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View row = li.inflate(R.layout.widget_text, null); 

    TextView tv = (TextView) row.findViewById(R.id.id_of_the_textview); 

widget_textは、表示された1つの代わりにImageViewsのTextViewsと同様のレイアウトであること、期待していくつかのサイズを取得しますそれのうち情報..

が、それは働いていないと、私はこの例外を取得:上

01-02 17:35:06.001: ERROR/AndroidRuntime(11025): Caused by: java.lang.IllegalArgumentException: width and height must be > 0 

Bitmap.createBitmap()

への呼び出しので、誰かが正しい方向に私を指すことができますか?

答えて

1

RemoteViewsでは、要素を非表示にして表示することができるので、遭遇する可能性があるすべてのフォントスタイルのテキストビューを複製しないでください。以下のような

何か:

widget.setViewVisibility(R.id.textview_italic,View.GONE); 
widget.setViewVisibility(R.id.textview_bold,View.VISIBLE); 

テキストを表示するために画像を使用するには、常に最後の手段でなければなりません。

+0

を私が見落としオプションですが、どのようにサイズを設定することを?私はおそらく、私はそれらの4つを持っていると考えて、多くのtextviewsを作る異なるサイズのtextviewsを持つことはできません... 320のtextviews(太字/イタリック/太字イタリック/ノーマル)フォントファミリなどの数を数えます。その場合は – foke

+0

、最後の手段に行ってください!これは、もちろん、いくつかのスタイルを持つメッセージが1つだけの場合にのみ実現可能です。最近のアンドロイド版のみを開発している場合は、ビューをRemoteViewに追加したり削除したりすることができます。あなたはまた私が思う4の倍数を失います。 (そして80未使用のレイアウトエントリは実際にはメモリ以外のリソースを消費しません) – mvds

+0

最後の手段は動作しません: '(:'( – foke

1

あなたは、動的にサイズを設定することができます。

float mySize = 10f; 
    updateViews.setFloat(R.id.textview, "setTextSize", mySize); 
+0

nice。私は、これらのメソッドがすべて "methodName"というパラメータを持っているのだろうかと思っていました。 – foke

関連する問題