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

Ars*_*war 9 layout fonts android

我有一个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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的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>
Run Code Online (Sandbox Code Playgroud)

Ron*_*nie 7

您检查TextView源代码,看看他们如何决定椭圆化字符串的位置.

对于代码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;
}
Run Code Online (Sandbox Code Playgroud)

i是TextView中适合的字符数.
availableWidth是以TextView像素为单位的宽度.

此代码是近似值,包含语法错误.您将不得不做一些小的改动才能使它正常工作.

更新2:

另一种选择是使用

int breakText (CharSequence text,      
                int start, int end,   
                boolean measureForwards,   
                float maxWidth, float[] measuredWidth). 
Run Code Online (Sandbox Code Playgroud)

我认为这是最适合您的解决方案.在这里查看其文档.

更新:

使用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;
}
Run Code Online (Sandbox Code Playgroud)