2012-02-20 42 views
1

我正在尝试制作缩放内容以使其全部显示,无裁剪,多行或省略号的textview。动态缩放文本以确保它适合单行文本视图

我会快速浏览布局,以便将其放入上下文中。

*有一个gridview有几个行和列。 *为GridView项都受到它返回一个适配器(伪标记:))提供: -

<LinearLayout Orientation=vertical> 
    <MyCustomTextview name='titletext' Not multiline /> 
    <MyCustomTextview name='itemtext' Not multiline /> 
</LinearLayout> 

我试过中重写onSizeChanged因为这是几个谷歌搜索结果指向了我,我开始与: -

... 
if (this.getLinecount() > 1) 
{ 
    this.setTextSize(... currentsize -10); 
} 
... 

,这给了我非常小的文本那里将出现在多行,所以我知道我可以调整大小,看看TextView的正确有一个以上的线。

所以我进展到: -

while (this.getLinecount() > 1) 
{ 
    this.setTextSize(... currentsize - 1); 
} 

我预计运行,直到文本是足够小,但调用setTextSize getLineCount()返回0,我相信这是因为它需要重新计算后文本大小,所以我尝试refreshLayout(),forceLayout()和invalidate()的各种组合无济于事。

我有一个想法也许是一个更好的办法,但我不知道这是否是很容易达到的: -

它达产后将GridView通过适配器,所以我会执行我的代码onSizeChanged被称为在那里,但是有以下可能和如何: -

  • TextView设置为填充父母的宽度,我可以准确地告诉文字的可用空间的宽度的像素大小? (我相信可能会有填充等应用)
  • 然后,我打算使用measureText(String)来查看文本是否合适,如果不减小大小并再次检查。

我相信这将是一个很好的解决方案,但我不确定如何准确测量可用空间,以及如果我选择的活动最好。

任何援助将不胜感激。

  • 安东尼
+0

检查这一点 - http://stackoverflow.com/questions/7259016/scale-text-in-a-view-to-fit/7259136#7259136 – Ronnie 2014-03-19 12:16:33

回答

0

你为什么不尝试相同的排序方法,但使用measureText呢?

while (mPaint.measureText(MyTextString)>mTextView.getWidth()) //maybe adjust for padding/margins etc 
{ 
    mPaint.setTextSize(... currentsize - 1); 
} 
+0

对不起 - 刚才看到你已经提到了这一点。但那将是我的方法。 – CjS 2012-02-20 10:54:28

+0

嗨,这是我首选的方法,我用这种方法的具体问题是我不确定如何调整边距和填充(我的理解是getWidth()返回TextView的外部大小而不是内部可用空间)我看到你的代码在考虑这一点的时候被评论过,你碰巧知道什么是确定文本框中可用空间的最好/最准确的方法? (事后看来,我应该把这个问题标题为这样)。 – 2012-02-20 11:18:40

+0

我不确定,但实际上:)但我也喜欢@ PravinCG的回答。但是,我认为混合方法可能是最好的。如果文本发生更改,则可以使用ViewTreeObserver触发调整大小,但是您可以使用MeasureText来一次性计算正确的字体大小。顺便说一句,你显然也必须检查的情况下,即使在字体大小1,它仍然不适合一行,并在那里做一些其他计划 – CjS 2012-02-20 11:34:38

1

您不需要为此创建自定义文本视图。使用ViewTreeObserver获取所需的功能。

TextView tv = (TextView)findViewById(R.id.mytextview); 
ViewTreeObserver vto = tv.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(this); 

@Override 
public void onGlobalLayout() { 
    if (1 < tv.getLineCount()) { 
     tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
       tv.getTextSize() - 2); 
    } 
} 
+0

这段代码是否也会“循环”,即onGlobalLayout一遍又一遍被调用,直到测试合适? – CjS 2012-02-20 11:06:25

+0

是的,它的原因是,除非绘制视图,否则将永远不会获得实际大小。这段代码动态地工作,它反复地缩小了大小,直到它适合单行。 – PravinCG 2012-02-20 11:21:15

+0

此代码是否会在达到正确大小之前导致文本在屏幕上被多次绘制? – 2012-02-20 12:03:35