说我有一个特定大小的TextView(真的不重要...... fill_parent,20dip,等等)。是否有可能告诉文本缩小/增大以适应可用空间而不需要进行大量数学处理?
答案 0 :(得分:18)
嗯,它比“很多复杂的数学”更简单,但是如果文本的宽度与文本视图的宽度相差太远,那么我使用的黑客解决方案是可行的。
// HACK to adjust text width
final int INITIAL_TEXTSIZE = 15;
final int TEXTVIEW_WIDTH = textviewBackground.getIntrinsicWidth(); // I use the background image to find the width, but you can use a fixed value or whatever other method you prefer.
final String text = ...;
textView.setText( text );
int size = INITIAL_TEXTSIZE;
while( textview.getPaint().measureText(text) > TEXTVIEW_WIDTH )
textview.setTextSize( --size );
如果文本的宽度可能与TextView的宽度明显不同,那么最好采用二分搜索而不是线性搜索来找到正确的字体大小。
不是说这是一个理想的解决方案,但如果你不经常需要调整你的文本大小,这是一个权宜之计。如果你需要经常调整你的文本大小,那么做一些复杂的数学可能会更好。
答案 1 :(得分:2)
我尝试了几乎所有上述内容,其中大多数都失败了,其中包括前一名。我发现最简单和最有效的是来自emmby,但发现你必须设置初始的文本大小。以下是对他不需要指定任何文本大小的改进:
final String text = "HELP";
TextView tvFlash = (TextView) findViewById(R.id.tvFlash);
DisplayMetrics metrics = getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;
tvFlash.setText(text);
tvFlash.setTextSize(TypedValue.COMPLEX_UNIT_PX, 1);
int size = 1;
do
{
float textWidth = tvFlash.getPaint().measureText(text);
if (textWidth < width)
tvFlash.setTextSize(++size);
else
{
tvFlash.setTextSize(--size);
break;
}
}while(true);
答案 2 :(得分:0)
不是我知道,抱歉。
答案 3 :(得分:0)
你可以计算TextView的想法字体大小值。这是填充它而不是太大的字体大小。公式是:
fontSize = (TextView Height) * (width DPI / height DPI) / (Screen Width * Screen Height);
可以通过覆盖活动中的onConfigurationChanged方法,并使用newConfig.screenWidthDp和newConfig.screenHeightDp来获取宽度和高度DPI。
可以使用以下辅助函数
获取屏幕大小(以像素为单位)// Get Screen Size
static public Point getScreenSize(Activity aActivity)
{
Display display = aActivity.getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
return size;
}
我只是根据需要计算这个值(在onConfigurationChanged中)并将其推送到某个静态助手类。然后,当TextView需要确定要使用的字体大小时,它会将其从此类中拉出来。
它可行,但可能不是最简单的解决方案。