2011-01-02 2 views
0

Я создаю виджет, который отображает текст. По виджетам я подразумеваю вид, который лежит на рабочем столе.рендеринг TextView в растровом виде для виджета android

Проблема в том, что я хочу изменить шрифт текста во время выполнения. Там будет несколько TextView Я хотел бы, во время выполнения, чтобы установить первый, как жирный, второй синий и курсивом, например, и т.д.

Я пришел с этим:

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); 

с

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; 
} 

но это не будет работать (NullPointerException на первой линии LoadBitmap), пока я не заменить v.getLayoutParams().width, v.getLayoutParams().height фиксированными размерами, как 250, 50

Bitmap b = Bitmap.createBitmap(250, 50, Bitmap.Config.ARGB_8888); 
// ... 
v.layout(0, 0, 250, 50); 

Но это не является хорошим решением ...

поэтому я попытался это:

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 быть макет, похожий на отображаемом один, но с TextViews вместо ImageViews, в надежде получить размер информация из него ..

, но это не работает, и я получаю это исключение:

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 из них ... для 20 размеров, которые сделают 320 текстовых просмотров (полужирный/курсив/boldItalic/normal) ... даже считая для семейства шрифтов и таких вещей. – foke

+0

в таком случае, идите в крайнем случае! Это было бы возможно только в том случае, если это всего лишь одно сообщение с несколькими стилями, конечно. BTW, если вы разрабатываете только последние версии андроида, вы можете динамически добавлять и удалять представления в RemoteViews, что может сделать этот вариант еще раз. Думаю, вы также потеряете множитель 4. (и 80 неиспользуемых записей макета на самом деле не потребляют ресурсы, отличные от памяти) – mvds

+0

, но последнее средство не будет работать: '(:' ( – foke

1

Вы можете установить размер динамически:

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

nice. Мне было интересно, какие были все эти методы с параметром "methodName" – foke

Смежные вопросы