Android字体大小在平板上不进行缩放。
Android字体大小在平板上不进行缩放。
我正在尝试创建一个方法,用于调整TextView
中的多行文本大小,使其适应TextView
的边界(包括X和Y维度)。
目前,我有一些代码,但它只是调整文本的大小,使得文本的第一个字母/字符填满TextView
的维度(即只有第一个字母可见,而且很大)。我需要将文本的所有行都适应TextView
的边界。
以下是我目前的代码:
public static void autoScaleTextViewTextToHeight(TextView tv) { final float initSize = tv.getTextSize(); //获取视图背景图的宽度(未缩放).... float minViewHeight; if(tv.getBackground()!=null) { minViewHeight = tv.getBackground().getIntrinsicHeight(); } else { minViewHeight = 10f;//一些最小值。 } final float maxViewHeight = tv.getHeight() - (tv.getPaddingBottom()+tv.getPaddingTop())-12;// 减12只是为了确保 final String s = tv.getText().toString(); //System.out.println(""+tv.getPaddingTop()+"/"+tv.getPaddingBottom()); if(minViewHeight >0 && maxViewHeight >2) { Rect currentBounds = new Rect(); tv.getPaint().getTextBounds(s, 0, s.length(), currentBounds); //System.out.println(""+initSize); //System.out.println(""+maxViewHeight); //System.out.println(""+(currentBounds.height())); float resultingSize = 1; while(currentBounds.height() < maxViewHeight) { resultingSize ++; tv.setTextSize(resultingSize); tv.getPaint().getTextBounds(s, 0, s.length(), currentBounds); //System.out.println(""+(currentBounds.height()+tv.getPaddingBottom()+tv.getPaddingTop())); //System.out.println("Resulting: "+resultingSize); } if(currentBounds.height()>=maxViewHeight) { //为了确保,减小值 tv.setTextSize(resultingSize-1); } } }
我认为问题在于使用tv.getPaint().getTextBounds(...)
。它总是返回文本边界的较小数字... 相对于tv.getWidth()
和tv.getHeight()
的值而言很小... 即使文本大小远大于TextView
的宽度或高度。
问题的出现原因是在Android平板上字体大小不会自动缩放。解决方法是使用AutofitTextView库。首先,在app/build.gradle
文件中添加以下内容:repositories { mavenCentral() } dependencies { implementation 'me.grantland:autofittextview:0.2.+' }
,然后在代码中或者XML中启用任何继承自TextView的View,例如:AutofitHelper.create(textView);
或者在XML中使用me.grantland.widget.AutofitLayout
和me.grantland.widget.AutofitTextView
。这个库的功能类似于iOS的adjustsFontSizeToFitWidth,但不支持StyleSpans,可能会导致文字截断。这个解决方案非常完美,感谢提供答案的人。
问题出现的原因:
这个问题出现的原因是在不同的7英寸平板电脑上,字体大小没有正确缩放。作者尝试了很长时间,但是无法在各种不同的设备上得到正确的字体大小。
解决方法:
最后作者找到了一个可行的解决方法。下面是解决方法的代码。其中的数字"32"是一个任意的因子,用来在7英寸的平板电脑水平线上显示大约70多个字符,这是作者想要的字体大小。根据需要进行调整。
textView.setTextSize(getFontSize(activity)); public static int getFontSize (Activity activity) { DisplayMetrics dMetrics = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(dMetrics); // lets try to get them back a font size realtive to the pixel width of the screen final float WIDE = activity.getResources().getDisplayMetrics().widthPixels; int valueWide = (int)(WIDE / 32.0f / (dMetrics.scaledDensity)); return valueWide; }
感谢作者的帖子。这个方法非常有效,我将修改它以接受传入的字体大小,并输出正确的字体大小。
这是一个很好的改进建议,是的,你可以指定一个目标大小,然后它可以为所有设备设置通用大小。