假设我有一个特定大小的TextView(实际上并不重要,可以是fill_parent、20dip或任何其他尺寸),是否有可能让文本根据可用空间自动收缩/增大以适应呢?而不需要进行很多数学计算。
嗯,这比“很多复杂的数学”简单一些,但我有一个可行的黑科技解决方案,如果你的文本宽度与TextView的宽度相差不太大,那么就可以使用它。
// 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的宽度相差较大,最好使用二分查找来找到正确的字体大小。
并不是说这是一个理想的解决方案,但如果您不经常需要调整文本大小,这是一个便捷的解决方法。如果您需要频繁调整文本大小,则最好进行一些复杂的数学计算。
我尝试了以上几乎所有的方法,包括排名第一的。大多数都失败了。最简单且最有效果的方法是来自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);
很抱歉,我不知道有这样的情况。
你可以计算TextView的理想字体大小值。这是填充它而不会太大的字体大小。公式如下:
fontSize = (TextView Height) * (width DPI / height DPI) / (Screen Width * Screen Height);
通过覆盖Activity中的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;
}