为什么我在代码中运行TextView.measure()得到不同的结果,从我在屏幕上看到的呈现

时间:2014-01-16 06:57:05

标签: android android-layout textview

我现在正尝试在TextView中以某种方式重叠文本来解决问题。 I've posted a question about that,但我也试过自己解决。我决定计算导致textview打破这一行的文本量。我想出了这个未经修改的代码,它基本上应该给视图充气,根据显示的大小设置它的布局参数,然后运行onmeasure并返回lineCount。我计划使用可能的二进制搜索来找到适合textview的确切文本长度,但是在我尝试运行代码并查看它的行为之前。这有点奇怪,因为它给我的结果不同于我在屏幕上看到的结果。我甚至试图根据缩放密度来改变文本大小,因为我不确定它是否被考虑在内。

这是代码。它返回三个,但是当我将布局渲染到屏幕时,文本只占用两行。

public int getCountOfLines(Context context, int widgetDp){

    LayoutInflater mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    LinearLayout layout = (LinearLayout) mLayoutInflater.inflate(R.layout.event_basic_large ,null, false);

    TextView titleTextView = (TextView) layout.findViewById(R.id.itemTitle);
    titleTextView.setText(TEST_TEXT);

    float density = context.getResources().getDisplayMetrics().density;
    float textDensity = context.getResources().getDisplayMetrics().scaledDensity;

    titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleTextView.getTextSize()/density*textDensity);

    layout.setLayoutParams(
            new LinearLayout.LayoutParams(
                    (int) (widgetDp*density),
                    ViewGroup.LayoutParams.WRAP_CONTENT)
    );


    layout.measure(View.MeasureSpec.makeMeasureSpec(
            (int) (widgetDp*density), View.MeasureSpec.EXACTLY),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
    );

    Log.d(TAG, titleTextView.getLineCount() + " lines, width "+titleTextView.getMeasuredWidth());


    return titleTextView.getLineCount();
}

1 个答案:

答案 0 :(得分:1)

我跑了一会儿,经过搜索和尝试后终于得到了以下功能:

public int getLineCount(String testString, float textSize, 
        float width) {
    Rect bounds = new Rect();
    Paint paint = new Paint();
    paint.setTypeface(<font>);//set font that you are using for this
    paint.setTextSize(textSize);
    paint.getTextBounds(testString, 0, testString.length(), bounds);

    return (int) Math.ceil(bounds.width() / width);
}

此函数使用textSize和width来给出行数。 此函数在显示之前给出textview中的行数。