2

我有一个方形的 FrameLayout。我在布局中有一个 TextView 和一个供用户增加/减少 textSize 的选项。当文本大到足以填满整个 FrameLayout 时,我想限制文本增加选项。因此,如果我从 25sp 之类的东西开始,当用户达到 40sp 并且 TextView 高度超过 FrameLayout 高度时,我需要恢复到 39sp 并禁止进一步增加文本大小。TextView 的来源是可跨度的。

到目前为止,我是这样做的。

在增加按钮上,我只是setTextSize(currentValue + 1)针对每个可跨片段;

因为当我再次 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/参考/android/text/style/CharacterStyle.html

任务相当复杂,所以如果遇到任何麻烦,请随时寻求更多帮助。我用来测量文本的代码很长而且没有注释,所以我可能会将它发布到谷歌代码以备不时之需。

于 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

你可以尝试这样的事情:

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

收到的所有答案都很好,但在我的情况下,我没有找到合适的方法来检测我的 TextView 在应用 Spannable 时如何实际包装文本。为了获得我需要的结果,我刚刚在我的 FrameLayout 中添加了一个具有透明字体颜色的新 TextView。首先,我将更改应用到这个不可见的 TextView,如果一切正常,我将更改传播到实际可见的 TextView。

于 2013-03-05T07:25:48.933 回答