如何获得可以适合Screen / TextView具有特定大小的N文本? [英] How to get N text that can be fit on Screen/TextView with a specific size?

查看:131
本文介绍了如何获得可以适合Screen / TextView具有特定大小的N文本?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

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

解决方案



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

  package com.gsoft.measure.text; 

import java.util.Timer;
import java.util.TimerTask;

导入android.app.Activity;
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.Message;
导入android.util.Log;
导入android.widget.LinearLayout;
导入android.widget.TextView;

public class MainScreen extends Activity {

private final String TAG =MainScreen;
private String textToBeShown =这些是文本;
private String sampleText =这是更多的文字;
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;
}

//我正在使用计时器,因为用户界面中没有创建和
//我们无法获得宽度。
TimerTask task = new TimerTask(){

@Override
public void run(){
//使UI线程可以处理UI工作
handler.sendEmptyMessage(1);
}
};
定时器定时器=新的定时器();
timer.schedule(任务,1000 * 1);


@Override
protected void onResume(){
super.onResume();


$ b private void updateUI(){

//设置文本
mTextView.setText(textToBeShown);
//检查宽度
Log.e(TAG,Width =+ mTextView.getWidth());

//检查一行的高度
Log.e(TAG,Line height =+ mTextView.getLineHeight());

//检查TextView的总高度
Log.e(TAG,Text height =+ mTextView.getHeight());

//我们可以在textview中显示的行数
int totalLine = mTextView.getHeight()/ mTextView.getLineHeight();
Log.e(TAG,Total Lines is height =+ totalLine);


for(int i = 0; i< totalLine; i ++){
//获取字符数适合textView
int数字= mTextView。 getText(),getPaint()。breakText(textToBeShown,0,textToBeShown.length(),true,
mTextView.getWidth(),null);
Log.e(TAG,Number of number =+ number);

//显示符合
的文字Log.e(TAG,textToBeShown.substring(0,number));
//更新文本以显示下一个
textToBeShown = textToBeShown.substring(number,textToBeShown.length());





lockquote

这是我的XML




 <?xml version =1.0encoding =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>


解决方案

/ code>源代码,看看它们是如何决定在哪里省略字符串的。
$ b TextView here。



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



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


$ b

更新:



另一种方法是使用 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 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;

$ / code $ / pre
$ b $ i 是适合在TextView中的字符数。

availableWidth TextView 中的宽度像素。



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



更新2:



另一种替代方法是使用

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

我认为这是最适合您的解决方案。检查它的这里的文档。

更新:



使用paint的示例代码 breakText 方法

  paint.setSubpixelText真正); 
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;
}


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 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

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>

解决方案

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.

Update:

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.

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.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;
}

这篇关于如何获得可以适合Screen / TextView具有特定大小的N文本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆