0

情報のために、テキストを境界内に収める方法を説明するすべてのリソースを調べました

  1. 境界内に収まるようにTextViewテキストを自動スケーリング
  2. TextViewに合わせてテキストを拡大/縮小する方法は?
  3. テキストビューに合わせてテキストのフォントサイズを調整する方法
  4. ジンジャーブレッドとジェリービーンズの Android フォント サイズの違いの問題

TextViewしかし、私の主な問題は、テキストの境界内に収まるようにフォントのサイズを変更Custom FontしたくないということassetsですsliderJelly Bean問題はないようですが、デバイスのテキストは画像に示すように Jelly Beanの境界に適合しませんTextViewテキストビューが合わない

さらに、回答に記載されている目的のソリューションはどちらも役に立ちません。何らかの方法で、ソリューションの一部は、境界内に収まるようにサイズを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");
        }
   }
}

EditTextここで、デフォルトのAndroid on wrap_contentparamsで示されるように、テキスト全体が次の行に移動するように、単語が壊れないようにしたいと考えています。さらに、 を計算するための式は正確ではありません。正確な長さを知りwordLimitたいだけです。stringwidthLimitTextView/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 に答える