使TextView适合Android上的布局

时间:2013-02-26 10:47:37

标签: android textview spannable

我有一个方形的FrameLayout。我在布局中有一个TextView,以及一个用户增加/减少textSize的选项。我希望限制文本增加选项,当文本足够大以填充整个FrameLayout时。因此,如果我从25sp开始,当用户达到40sp并且TextView高度超过FrameLayout高度时,我需要恢复到39sp并禁止进一步增加文本大小。 TextView的源代码是一个spannable。

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

在增加按钮上,我只为每个可跨越的片段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)
}

缺点是增加文本的可见操作 - >再次减少它。因此,用户将看到100ms的文本变大,然后恢复。 有没有一种处理这种计算的好方法,所以我可以避免实际增加文本大小?

4 个答案:

答案 0 :(得分: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代码,以备不时之需。

答案 1 :(得分: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);
}

答案 2 :(得分:0)

您可以尝试这样的事情:

textView.getLayoutParams.height = screen.getWidth();
textView.requestLayout();

答案 3 :(得分:0)

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