如何获得可以适合Screen / TextView具有特定大小的N文本?

我有一个string格式的大故事。 我想在图库中显示文字。 我想要做的就是把所有的文本切成这样的样子,以便我在图库中的所有视图都能显示出适合屏幕的文字。

这样我就可以制作出一部分string,每个部分都会显示在屏幕上,每个部分都会覆盖整个屏幕。

有一点需要注意的是,用户可以改变文本大小,所以屏幕上的文字也会随着大小的改变而改变。

我想知道有没有办法做到这一点。 请帮帮我

非常感谢userSeven7s帮助我。 根据你的例子,我可以做一个例子。 这里是

package com.gsoft.measure.text; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.widget.LinearLayout; import android.widget.TextView; public class MainScreen extends Activity { private final String TAG = "MainScreen"; private String textToBeShown = "These are the text"; private String sampleText = "Here are more text"; private TextView mTextView = null; Handler handler = new Handler() { public void handleMessage(Message msg) { if (msg.what == 1) { updateUI(); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mTextView = (TextView) findViewById(R.id.ui_main_textView); mTextView.setTextSize(20f); for (int i = 0; i < 100; i++) { textToBeShown = textToBeShown + " =" + i + "= " + sampleText; } // I am using timer as the in UI is not created and // we can't get the width. TimerTask task = new TimerTask() { @Override public void run() { // So that UI thread can handle UI work handler.sendEmptyMessage(1); } }; Timer timer = new Timer(); timer.schedule(task, 1000 * 1); } @Override protected void onResume() { super.onResume(); } private void updateUI() { // Set text mTextView.setText(textToBeShown); // Check the width Log.e(TAG, "Width = " + mTextView.getWidth()); // Check height of one line Log.e(TAG, "Line height= " + mTextView.getLineHeight()); // Check total height for TextView Log.e(TAG, "Text height= " + mTextView.getHeight()); // No of line we can show in textview int totalLine = mTextView.getHeight() / mTextView.getLineHeight(); Log.e(TAG, "Total Lines are height= " + totalLine); for (int i = 0; i < totalLine; i++) { // Get No of characters fit in that textView int number = mTextView.getPaint().breakText(textToBeShown, 0, textToBeShown.length(), true, mTextView.getWidth(), null); Log.e(TAG, "Number of chracters = " + number); // Show the text that fit into line Log.e(TAG, textToBeShown.substring(0, number)); // Update the text to show next textToBeShown = textToBeShown.substring(number, textToBeShown.length()); } } } 

这是我的XML

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout_id_for_value" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/black" android:orientation="vertical" > <TextView android:id="@+id/ui_main_textView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/twitter" android:textColor="@color/white" /> </LinearLayout> 

Solutions Collecting From Web of "如何获得可以适合Screen / TextView具有特定大小的N文本?"

您检查TextView源代码,看看他们如何决定在哪里省略string。

TextView的代码在这里 。

或者,您可以使用TextUtils类的public static CharSequence ellipsize(CharSequence text, TextPaint p, float avail, TruncateAt where)方法。

TextPaint p应该是TextView的绘画对象。

更新:

另一种方法是使用Paint.getTextWidths(char[] text, int index, int count, float[] widths)

 textpaint.getTextWidths(char[] text, int index, int count, float[] widths); int i = 0; int prev_i = 0; while (i < count) { textWidth = 0; for (int i = prev_i; (i < count) || (textWidth < availableWidth); i++) { textWidth += widths[i]; } String textThatFits = mOriginalText.subString(prev_i, i); mTextview.setText(textThatFits); prev_i = i; } 

i是适合在TextView中的字符数。
availableWidthTextView的宽度(以像素为单位)。

此代码是近似值,包含语法错误。 你将不得不做一些小的改变,以使其工作。

更新2:

另一种select是使用

 int breakText (CharSequence text, int start, int end, boolean measureForwards, float maxWidth, float[] measuredWidth). 

我认为这是对你最好的解决scheme。 在这里检查它的文档。

更新:

使用绘图的示例代码。 breakText方法。

 paint.setSubpixelText(true); int prevPos = 0; while (nextPos < chars.length) { int nextPos = paint.breakText(chars, prevPos, chars.length, maxWidth, null); tvStr = str.substring(prevPos, nextPos); prevPos = nextPos+1; } 

如果每个部分的字符数量不同,他们也需要不同的字体大小。 不仅如此,而且太小的设备也将具有太小的字体大小,因为文本需要适合更小的空间。 我build议所有部分的字体大小相同,如果没有足够的空间,可以向下滚动。

为此,您可以在每个页面上使用带有滚动视图的viewpager,每个视图都包含一个textview。

Graphics.getFontMetrics和FontMetrics.stringWidth将帮助您确定屏幕上文本的真实大小。 基于这个计算,你可以确定显示的子串应该是多长。