gpt4 book ai didi

android - 如何获取适合特定大小的 Screen/TextView 的 N 个文本?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:23 25 4
gpt4 key购买 nike

我有一个字符串格式的大故事。我想在图库中显示文字。我想要做的是以这样一种方式切片所有文本,即我在图库中的所有 View 都显示适合屏幕的文本。

这样我就可以把我的字符串分成几部分,每个部分都会显示在屏幕上,每个部分都会覆盖整个屏幕。

需要注意的一件事是用户可以更改文本大小 Large , Small 因此屏幕上的文本也会随着大小的变化而变化。

我想知道是否有办法做到这一点。

解决方案

非常感谢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>

最佳答案

您检查 TextView 源代码,看看它们如何决定在何处省略字符串。

TextView 的代码是 here .

或者,您可以使用 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:

另一种选择是使用

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

我认为这是最适合您的解决方案。检查其 documentation here.

更新:

使用 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;
}

关于android - 如何获取适合特定大小的 Screen/TextView 的 N 个文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10431945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com