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.
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 text on screen will also be change as size change.
I am wondering if there is a way to do this.
Thank you so much to userSeven7s for helping me. Based on your example I am able to make an example. Here it is:
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 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>
To use preset sizes to set up the autosizing of TextView in XML, use the android namespace and set the following attributes: Set the autoSizeText attribute to either none or uniform. none is a default value and uniform lets TextView scale uniformly on horizontal and vertical axes.
You are applying to your TextView a compound Drawable on the right.. to make the three dots appear in this scenario, you have to apply a android:drawablePadding="{something}dp" attribute to the TextView as well. Hope it helps!
SetText(String, TextView+BufferType) Sets the text to be displayed using a string resource identifier.
app:autoSizeMinTextSize=”10sp” using this attribute the TextView will be resized up to the size of 10sp and app:autoSizeStepGranularity=”2sp” using this attribute we are uniformly reducing the size of the TextView as 2sp when it goes out of the screen.
You check the TextView
source code and see how they decide where to ellipsize the string.
The code for TextView
is here.
Alternatively, you can use TextUtils
class's public static CharSequence ellipsize(CharSequence text,
TextPaint p,
float avail, TruncateAt where)
method.
TextPaint p
should be the TextView's paint object.
Another alternative is to use 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.
This code is approximate and contains syntax errors. You will have to do some minor changes to get it working.
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.
Sample code using paint.breakText
method.
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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With