I have a large story in String format. I want to show the text in gallery. What I want to do is to slice all the text in such a way that all my view in gallery show the text which fit on the screen.
我有一个String格式的大故事。我想在图库中显示文字。我想要做的是以这样的方式切片所有文本,使我在画廊中的所有视图显示适合屏幕的文本。
So that I can make my string in part , where each part will be shown on screen and each part will cover the whole screen.
因此,我可以将我的字符串部分制作,每个部分将显示在屏幕上,每个部分将覆盖整个屏幕。
One thing to be note is that user can change text size Large , Small so the tex t on screen will also be change as size change.
需要注意的一点是,用户可以将文本大小更改为大,小,因此屏幕上的文本也会随着大小的变化而变化。
I am wondering is there any way to do this. Please help me
我想知道有没有办法做到这一点。请帮帮我
Solution
Thanks you so much for userSeven7s for helping me. Based on your example I am able to make a Example. Here it is
非常感谢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());
}
}
}
Here is my XML
这是我的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>
3 个解决方案
#1
7
You check the TextView
source code and see how they decide where to ellipsize the string.
您检查TextView源代码,看看他们如何决定椭圆化字符串的位置。
The code for TextView
is here.
TextView的代码在这里。
Alternatively, you can use TextUtils
class's public static CharSequence ellipsize(CharSequence text, TextPaint p, float avail, TruncateAt where)
method.
或者,您可以使用TextUtils类的public static CharSequence ellipsize(CharSequence text,TextPaint p,float avail,TruncateAt where)方法。
TextPaint p
should be the TextView's paint object.
TextPaint p应该是TextView的绘图对象。
Update:
Another alternative is to use Paint.getTextWidths(char[] text, int index, int count, float[] widths)
.
另一种方法是使用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
is the number of characters that fit in the TextView.availableWidth
is the width of the TextView
in pixels.
我是适合TextView的字符数。 availableWidth是TextView的宽度(以像素为单位)。
This code is approximate and contains syntax errors. You will have to do some minor changes to get it working.
此代码是近似值,包含语法错误。您将不得不做一些小的改动才能使它正常工作。
Update 2:
Another alternative would be to use
另一种选择是使用
int breakText (CharSequence text,
int start, int end,
boolean measureForwards,
float maxWidth, float[] measuredWidth).
I think this is the best solution for you. Check its documentation here.
我认为这是最适合您的解决方案。在这里查看其文档。
Update:
Sample code using paint.breakText
method.
使用paint.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;
}
#2
0
if each part has a different number of characters , they will also need to have different size of fonts . not only that , but too small devices will also have a too small font size , since the text need to fit a smaller space. i'd suggest having the same font size for all of the parts , while allowing to scroll down if there is not enough space.
如果每个部分具有不同数量的字符,则它们还需要具有不同大小的字体。不仅如此,太小的设备也会有太小的字体大小,因为文本需要适合更小的空间。我建议为所有部件使用相同的字体大小,同时允许在没有足够空间的情况下向下滚动。
for this , you can use a viewpager with scrollviews on each page , each contain a textview.
为此,您可以在每个页面上使用带有滚动视图的viewpager,每个都包含一个textview。
#3
0
Graphics.getFontMetrics and FontMetrics.stringWidth will help you to determine real size of text on the screen. Based on this calculation you can determine how long shown substring should be.
Graphics.getFontMetrics和FontMetrics.stringWidth将帮助您确定屏幕上文本的实际大小。根据此计算,您可以确定显示的子字符串应该有多长。
#1
7
You check the TextView
source code and see how they decide where to ellipsize the string.
您检查TextView源代码,看看他们如何决定椭圆化字符串的位置。
The code for TextView
is here.
TextView的代码在这里。
Alternatively, you can use TextUtils
class's public static CharSequence ellipsize(CharSequence text, TextPaint p, float avail, TruncateAt where)
method.
或者,您可以使用TextUtils类的public static CharSequence ellipsize(CharSequence text,TextPaint p,float avail,TruncateAt where)方法。
TextPaint p
should be the TextView's paint object.
TextPaint p应该是TextView的绘图对象。
Update:
Another alternative is to use Paint.getTextWidths(char[] text, int index, int count, float[] widths)
.
另一种方法是使用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
is the number of characters that fit in the TextView.availableWidth
is the width of the TextView
in pixels.
我是适合TextView的字符数。 availableWidth是TextView的宽度(以像素为单位)。
This code is approximate and contains syntax errors. You will have to do some minor changes to get it working.
此代码是近似值,包含语法错误。您将不得不做一些小的改动才能使它正常工作。
Update 2:
Another alternative would be to use
另一种选择是使用
int breakText (CharSequence text,
int start, int end,
boolean measureForwards,
float maxWidth, float[] measuredWidth).
I think this is the best solution for you. Check its documentation here.
我认为这是最适合您的解决方案。在这里查看其文档。
Update:
Sample code using paint.breakText
method.
使用paint.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;
}
#2
0
if each part has a different number of characters , they will also need to have different size of fonts . not only that , but too small devices will also have a too small font size , since the text need to fit a smaller space. i'd suggest having the same font size for all of the parts , while allowing to scroll down if there is not enough space.
如果每个部分具有不同数量的字符,则它们还需要具有不同大小的字体。不仅如此,太小的设备也会有太小的字体大小,因为文本需要适合更小的空间。我建议为所有部件使用相同的字体大小,同时允许在没有足够空间的情况下向下滚动。
for this , you can use a viewpager with scrollviews on each page , each contain a textview.
为此,您可以在每个页面上使用带有滚动视图的viewpager,每个都包含一个textview。
#3
0
Graphics.getFontMetrics and FontMetrics.stringWidth will help you to determine real size of text on the screen. Based on this calculation you can determine how long shown substring should be.
Graphics.getFontMetrics和FontMetrics.stringWidth将帮助您确定屏幕上文本的实际大小。根据此计算,您可以确定显示的子字符串应该有多长。