如何在Android中计算包含具有特定高度的TextView的行高?

时间:2013-11-27 16:18:59

标签: android android-layout textview height

我想计算(或布局)高度(在DP中),当使用默认行间距时,它只包含TextView作为TextView text size的结果?
I.E.对于这种布局:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/minRow1col1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:textIsSelectable="false"
        android:textSize="11dp" />  

</LinearLayout>

布局/线高是多少? (任何公式?我不需要运行时的值)

谢谢!

5 个答案:

答案 0 :(得分:9)

I don't know if this help you guys, but my solution to get the height of a line it's independent of the height of the layout, just take the font metrics like this:

myTextView.getPaint().getFontMetrics().bottom - myTextView.getPaint().getFontMetrics().top)

With this you will get the line height and for me, it's works with all words ( there are some chars like "g" or "j" that take some bottom space, the so called "descender" and so on ).

答案 1 :(得分:3)

尝试使用TextPaint的{​​{1}}对象。

TextView

TextView tv = useTextView; String text = tv.getText().toString(); Paint textPaint = tv.getPaint(); Rect textRect = new Rect(); textPaint.getTextBounds(text, 0, text.length(), textRext); int textHeight = textRect.height(); 的每个文档:

  

返回边界(由调用者分配)最小的矩形   包含所有字符,隐含的原点为(0,0)。

使用Paint#getTextBound使用的Paint对象将确保它具有与用于绘制文本相同的参数集。

答案 2 :(得分:0)

您可以尝试Paint.getTextBounds()

String finalVal ="Hello";

Paint paint = new Paint();
paint.setTextSize(18);  
paint.setTypeface(Typeface.SANS_SERIF);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);

Rect result = new Rect();
// Measure the text rectangle to get the height
paint.getTextBounds(finalVal, 0, finalVal.length(), result);

Log.d("WIDTH        :", String.valueOf(result.width()));
Log.d("HEIGHT       :", String.valueOf(result.height()));

Source

答案 3 :(得分:0)

对于我的用例,我首先假设行高是一个取决于文本大小的线性函数,如:

line_height = text_size*some_constant

现在some_constant可能也是一个函数,这取决于你使用的字体。但由于在我的要求中字体是静态的,我能够计算some_constant并以安全的方式重复使用。

为了让您了解我的用例,我正在缩放一段多行文字,以便将其放入一个可变高度的框中。

在我的用例中,我想更进一步,包括空间倍增器。这很简单,因为它只是等式中的另一个因素:

line_height = text_size*some_constant*spacing_multiplier

总而言之,如果您坚持使用相同的字体并且计算some_constant的值一次,您可以(可能)获得您的功能。

免责声明:我说“可能”很多,因为我没有测试过很多我的假设,但就像我说的那样,它适用于一个相当复杂的用例。

答案 4 :(得分:-1)

您必须创建自定义Textview并使用getActualHeight()方法。 公式的位置为:actualHeight=(int) ((getLineCount()-1)*getTextSize());

public class TextViewHeightPlus extends TextView {
    private static final String TAG = "TextView";
    private int actualHeight=0;


    public int getActualHeight() {
        return actualHeight;
    }

    public TextViewHeightPlus(Context context) {
        super(context);
    }

    public TextViewHeightPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public TextViewHeightPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

   @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        actualHeight=0;

        actualHeight=(int) ((getLineCount()-1)*getTextSize());

    }

}