0

只是为了提供信息,我已经使用了所有说明如何在界限内放置文本的资源

  1. 自动缩放 TextView 文本以适应边界
  2. 如何缩放/调整文本以适合 TextView?
  3. 如何调整文本字体大小以适合 textview
  4. 姜饼和果冻豆的Android字体大小差异问题

但我的主要问题是我不想调整字体大小以适应文本边界。我所拥有的是一个从文件夹TextView中获取的。此外,用户可以通过.All 低于那里的设备更改字体大小似乎没问题,但是设备上的文本不符合图像中 的边界Custom FontassetssliderJelly BeanJelly BeanTextView文本视图不合适

此外,stackoverflow答案中所述的有目的的解决方案都没有任何好处。不知何故,一些解决方案只是降低了font尺寸以适应范围。我不想降低字体大小,而是想执行以下操作

  1. 计算适合屏幕宽度的文本长度
  2. 然后以该特定长度将换行符附加到字符串
  3. 由于文本长度会很大,我害怕使用 StringBuffer 和 StringBuilder 因为它们很容易导致out of memory exception
  4. 所以TextView当达到可见长度时自动计算插入新闻行的因子。

到目前为止,我能够分解文本,通过计算一个有助于找到适合屏幕宽度的最小单词数量的因子。但是,这会导致单词被破坏,含义Hello可能会导致Hel一行和另一行继续lo

public class AutoResizeTextView extends TextView {

private boolean forFirstTime = true;

    @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    if (forFirstTime)
        monitorChanges();
}



private void monitorChanges() {
    final int widthLimit = getMeasuredWidth() - getCompoundPaddingLeft()
            - getCompoundPaddingRight();
    if (widthLimit <= 0) {
        return;
    }
    final String mainText = getText().toString();
    final float actualTextWidth = getPaint().measureText(mainText);

    forFirstTime = false;

    setText("");
    String[] overallText = inputText.split("\\n");

    for(int j=0;j<overallText.length;j++){
        String mainText =overallText[j];
        int length = mainText.length();
        int lineNumber = Math.round(getPaint().measureText(mainText)/ widthLimit);
        int wordLimit = (int) Math.round(length / (lineNumber * 1.3));
        //wordLimit+=2;
        if (wordLimit < length) {
            int count = Math.round(length / wordLimit);
            int startIndex = -1, endIndex = -1;
            for (int i = 0; i < count; i++) {
                startIndex = wordLimit * i;
                endIndex = wordLimit * (i + 1);
             append(mainText.substring(startIndex, endIndex) + "\n");
            }
        append(mainText.toString().substring(endIndex, length)+"\n");
        }
   }
}

现在我希望单词不会被破坏,如默认 android EditTexton wrap_contentparams 所展示的那样,如果它变得大到适合,整个文本将移动到下一行。而且计算公式wordLimit不准确,我只想找出string适合的widthLimit确切长度TextView/EditText

我也在努力,如果有任何事情发生,我一定会发布。

4

1 回答 1

0

我不知道这是否是正确的解决方案。但到目前为止,文本呈现良好并且没有文本被截断,即显示在边界内的文本。

public class AutoResizeTextView extends TextView {


@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    if (forFirstTime)
        monitorChanges();
}

private boolean forFirstTime = true;
    // Text view line spacing multiplier
    private float mSpacingMult = 1.0f;

    // Text view additional line spacing
    private float mSpacingAdd = 0.0f;

private void monitorChanges() {
    int widthLimit = getMeasuredWidth() - getCompoundPaddingLeft()
            - getCompoundPaddingRight();

    if (widthLimit <= 0) {
        return;
    }
    String inputText = getText().toString();

    forFirstTime = false;

    setText("");
    String[] overallText = inputText.split("\\n");

    TextPaint textPaint = getPaint();
    for(int j=0;j<overallText.length;j++){
        String mainText =overallText[j];
        StaticLayout layout = new    StaticLayout(mainText,textPaint,widthLimit,Alignment.ALIGN_NORMAL,
                mSpacingMult,mSpacingAdd,false);        
        if(layout.getLineCount()>0){
            for(int i=0;i<layout.getLineCount();i++){
                int start =layout.getLineStart(i);
                int end =layout.getLineEnd(i);
                append(mainText.substring(start, end)+"\n");
            }
        }

    }   
}
}

但我对结果并不完全满意;)

于 2013-01-17T10:08:06.293 回答