我正在尝试制作一个缩放内容的文本视图,以便全部显示,无裁剪,多行或省略。
我会快速浏览布局,将其置于上下文中。
*有一个包含多个行和列的网格视图。 * 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()无济于事。
我对一个更好的方法有一个想法,但我不知道它是否容易实现: -
onSizeChanged在被适配器放入Gridview之后被调用,因此我将在那里执行我的代码,但以下是可能的以及如何: -
我相信这将是一个很好的解决方案,但我不确定准确测量可用空间,以及我选择的事件是否最佳。
任何帮助都将不胜感激。
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
为什么不尝试相同的方法,而是使用measureText
?
while (mPaint.measureText(MyTextString)>mTextView.getWidth() ) //maybe adjust for padding/margins etc
{
mPaint.setTextSize(... currentsize - 1);
}