2

正方形の FrameLayout があります。レイアウト内に TextView があり、ユーザーが textSize を増減するオプションがあります。テキストが FrameLayout 全体を埋めるのに十分な大きさの場合、テキストの増加オプションを制限したいと考えています。したがって、25sp のようなものから始めて、ユーザーが 40sp に達し、TextView の高さが FrameLayout の高さを超えると、39sp に戻して、テキスト サイズをさらに大きくすることを禁止する必要があります。TextView のソースはスパン可能です。

これが私がこれまでに行った方法です。

増加ボタンではsetTextSize(currentValue + 1)、スパン可能なフラグメントごとに単純に I します。

再度 setText したときの TextView の「実際の」サイズがわからないため、使用しました

ViewTreeObserver vto = textView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
    //here I have the real sizes of the textView and if the height is too big, I simply
     setTextSize(currentValue - 1)
}

欠点は、テキストを増やしてから再び減らすという目に見える操作です。そのため、ユーザーは 100 ミリ秒ほどテキストが大きくなってから元に戻るのを見るでしょう。実際にテキストサイズを大きくすることを避けることができるように、この計算を処理する良い方法はありますか?

4

4 に答える 4

2

実際にサイズを変更する前に、 TextPaint と span クラスを使用してテキストを測定することをお勧めします。テキストを測定するには、スパンに分割する必要があります。次に、スパンを TextPaint オブジェクトに適用し、テキスト ブロックの寸法を要求する必要があります。

http://developer.android.com/reference/android/text/TextPaint.html http://developer.android.com/reference/android/graphics/Paint.FontMetrics.html http://developer.android.com/ reference/android/text/style/CharacterStyle.html

作業はかなり複雑ですので、お困りの際はお気軽にご相談ください。テキストを測定するために使用しているコードは長く、コメントが解除されているため、必要に応じて Google コードに投稿します。

于 2013-02-26T11:03:02.053 に答える
1

どうぞ:

TextView tv = (TextView) findViewById(R.id.tv); 
String myText = tv.getText().toString();
char[] array = myText.toCharArray();
Paint paint = tv.getPaint();
Rect textBound = new Rect();
paint.getTextBounds(array, 0, array.length, textBound);
boolean enough = tv.getHeight() <= textBound.height()
            || tv.getWidth() <= textBound.width();
if(enough){
  // don't increase size further
}else{
// increase size
}

アニメーションの場合、次のようなことができます。

final float proposed = tv.getTextSize() + 10;
final float orignal = tv.getTextSize();

if (enough) { 
    ObjectAnimator
                .ofFloat(this, "textSize", orignal, proposed, orignal)
                .setDuration(1000).start(); 
} else {
    ObjectAnimator.ofFloat(this, "textSize", orignal, proposed)
                .setDuration(500).start(); 
}


@SuppressWarnings("unused")
private void setTextSize(float val) {
    tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, val);
}
于 2013-02-26T11:27:59.757 に答える
0

受け取った回答はすべて素晴らしいですが、私の場合、Spannableが適用されたときにTextViewが実際にテキストをどのようにラップするかを検出する適切な方法が見つかりませんでした。必要な結果を得るために、FrameLayoutに透明なフォントカラーの新しいTextViewを追加しました。まず、この非表示のTextViewに変更を適用し、すべてが正常であれば、実際の表示されているTextViewに変更を伝播します。

于 2013-03-05T07:25:48.933 に答える
0

次のようなものを試すことができます:

textView.getLayoutParams.height = screen.getWidth();
textView.requestLayout();
于 2013-02-26T10:53:26.127 に答える