2013-11-02 2 views
0

Как рассчитать размер шрифта для TextView, чтобы вписаться в определенные мной ограничения с многострочным текстом?android textview рассчитать размер шрифта в соответствии с заданными границами

У меня есть TextView внутри RelativeLayout. На этапе выполнения будет известен размер экрана для приложения, основанный на этом.

Rect boundsTv = TextPositions.getTextViewBounds(1, mainActivity.mWidthPx, mainActivity.mHeightPx); 
    Log.e("SlideLoader", "paint.boundsTv() left, right, top, bottom :"+boundsTv.flattenToString());//paint.boundsTv() left, right, top, bottom :163 363 1767 749 

    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) tvText.getLayoutParams(); 
    params.width = boundsTv.width();// right - left; 
    params.height = boundsTv.height();// bottom - top; 
    params.leftMargin = boundsTv.left; // Your X coordinate 
    params.topMargin = boundsTv.top; // Your Y coordinate 
    tvText.setLayoutParams(params); 
    tvText.invalidate(); 

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

Выходной код с устройства, где размер шрифта на большой. Я проверил несколько методов, вероятно, будет предлагать эти 2 метода, как не в состоянии:

// left, top - right, bottom   
    TextPaint paint = tvText.getPaint();   
    paint.getTextBounds(text, 0, text.length()-1, boundsTv);   
    Log.e("SlideLoader", "paint.getTextBounds() left, right, top, bottom :"+boundsTv.flattenToString());//paint.getTextBounds() left, right, top, bottom :2 -33 16049 9, how to interpret this values?! 

    float width = paint.measureText(text);// for single line 

ответ

0

Here Я отправил решение. Надеюсь, кто-то даст лучший ответ, чем это.

Может быть следующий результат тоже: 1 с половиной строк ...

enter image description here

Некоторые тестовые устройства данные: Я являюсь «счастливым», чтобы увидеть меня 2 устройства с таким же размером экрана или размер экрана или версию Android или что-то еще? :)

// Lenovo phone: DisplayMetrics{density=1.5, width=800, height=480, scaledDensity=1.6500001, xdpi=240.0, ydpi=240.0}  width/height: 1.666 
// Lenovo tablet: DisplayMetrics{density=1.0, width=1024, height=552, scaledDensity=1.0, xdpi=160.0, ydpi=160.0}   width/height: 1.85 
// Samsung tablet: DisplayMetrics{density=1.0, width=1280, height=752, scaledDensity=1.0, xdpi=149.82489, ydpi=150.51852} width/height: 1.7 
// THL phone: DisplayMetrics{density=3.0, width=1920, height=1080, scaledDensity=3.3000002, xdpi=480.0, ydpi=480.0}  width/height: 1.77 

О, из-за разной ширины/соотношения высоты, текст не будет заканчиваться одним и тем же словом. Это может случиться, чтобы иметь только один ряд, на других устройствах, в то время как требуется 2 строки ...

 // get the text size 
     int textSize = 50; 
     int maxHeight = boundsTv.height(); 
     while (getHeightOfMultiLineText(text, textSize, params.width) > maxHeight) { 
      textSize--; 
     } 
     float scaleFactor = mainActivity.getResources().getDisplayMetrics().density; 
     float fuckingMagic = 1.8f; // large screens need a lower number, smaller screens a higher number. 
     // Samsung tablet 1.4 
     // THL phone 1.6 
     // Lenovo phone: 2.2 
     // Lenovo table 1.8 

     float size = textSize/(fuckingMagic * scaleFactor); 
1

Если вы не возражаете, определяя размер текста на основе размера экрана с помощью папки • например:

Рез /values-sw600dp/dimens.xml

содержание dimens.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="text_size">20sp</dimen> 
</resources> 

разреш/значения-w1024dp

содержания dimens.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="text_size">35sp</dimen> 
</resources> 

Теперь вы можете использовать экран размер определенного размера текста непосредственно в макете:

Я решил определить стиль для моего текста Реза/значений/стилей. XML

<style name="Text"> 
    <item name="android:padding">5dp</item> 
    <item name="android:paddingLeft">10dp</item> 
    <item name="android:paddingRight">10dp</item> 
    <item name="android:shadowColor">@color/Grey</item> 
    <item name="android:shadowDx">1</item> 
    <item name="android:shadowDy">1</item> 
    <item name="android:shadowRadius">1</item> 
    <item name="android:textColor">@color/Black</item> 
    <!-- Here the dimen/text_size is used --> 
    <item name="android:textSize">@dimen/text_size</item> 
    <item name="android:textStyle">bold</item> 
    <item name="android:typeface">monospace</item> 
    <item name="android:ellipsize">none</item> 
    <item name="android:gravity">left</item> 
    <item name="android:maxLines">1</item> 
    <item name="android:background">@color/Transparent</item> 
</style> 

И потому, что я динамически добавлять TextViews в мой макет, я определяю простой макет entry.xml:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
style="@style/Text" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:ellipsize="end" 
android:singleLine="false" /> 

Thats it. Когда я раздуваю макет entry.xml, размер текста будет соответствовать размеру дисплея.

Вы можете прочитать больше о технике здесь: http://wptrafficanalyzer.in/blog/different-layouts-for-different-screen-sizes-in-android/

+0

Pff ...Я решил определить около 40 папок и переключиться, это работает только теоретически и в документах Google, а не на практике;) +1 для усилий, но наверняка я бы не рекомендовал использовать в коммерческой среде, для домашней работы тоже хорошо –

+0

Хе-хе справедливо :), но если вам не нужно иметь разный размер для каждого размера экрана, то это довольно хорошее решение imo. Подумал бы, что вы были бы очень хороши на пути, скажем, от 3 до 5 размеров. Возможно, это соответствует вашим потребностям: https://github.com/danclarke/AutoResizeTextView – cYrixmorten

+0

Я добавил 4 из моих устройств, я готов поспорить, если я пойду на рабочее место и принесу 2 устройства, у них будут другие показатели :) –

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