TextView.setTextSize行为exception – 如何为不同的屏幕dynamic设置textview的文本大小

调用TextView.setTextSize()工作exception。 在调用setTextSize之后,如果我们得到一个getTextSize它返回一个更高的值,这个值是我们之前设置的。

以下是我们正在做的事情:

 zoomControl.setOnZoomInClickListener(new OnClickListener() { public void onClick(View view) { float size = mViewShabad.getTextSize() + 1; textView.setTextSize(size); } }); 

有没有人见过这个?

这里的区别是,在setTextSize(int size)方法中,默认的单位types是“sp”或“缩放像素”。 对于每个屏幕密度(ldpi,mdpi,hdpi),此值将是不同的像素尺寸。

getTextSize()另一方面返回文本的实际像素尺寸。

你可以使用setTextSize(int unit, float size)来指定单位types。 这个常数值可以在TypedValue类中find,但其中一些是:

 TypedValue.COMPLEX_UNIT_PX //Pixels TypedValue.COMPLEX_UNIT_SP //Scaled Pixels TypedValue.COMPLEX_UNIT_DIP //Device Independent Pixels 

发生这个问题是因为getTextSize()方法返回的像素大小取决于屏幕密度! 得到实际的TextSize使用这个:

 DisplayMetrics metrics; metrics = getApplicationContext().getResources().getDisplayMetrics(); float Textsize =myTextView.getTextSize()/metrics.density; myTextView.setTextSize(Textsize+1); 

我希望它能解决它:)

如果设置改变字体大小,导致显示错误,你可以这样做:

 setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f); 

当我们尝试setText()编程getTextSize()的问题时,返回的值是px而不是sp / dp / dip,我们知道1sp / dp = 1.5px(screen size = 240)。

  titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*1.5f)); 

是完美的为我工作,或者我们可以使用displaymatrix px:sp / dp ratio然后用1.5freplace那个值

 means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f)); 

总之,如果你想缩小你的文字大小

 float size = mViewShabad.getTextSize()*1.1f; textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size); 

因为getTextSize()返回UNIT_PX,那么我们应该使用UNIT_PX

为这个答案增加了一些额外的味道,也遇到了一些混乱。 您应该能够将此testing放到您的项目中的任何@RunWith(AndroidJUnit4.class)testing中(您还需要将dimens添加到您的dimens.xml中)。

注意:所有这些testing通过

 @Test public void testScaledFontSizes() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { final Context context = InstrumentationRegistry.getTargetContext(); Configuration configuration = context.getResources().getConfiguration(); configuration.fontScale = 2.0f; configuration.densityDpi = 160; // mdpi, 1:1 context.getResources().updateConfiguration(configuration, null); float scaledTextSize = context.getResources().getDimensionPixelSize(R.dimen.sp_15); assertEquals(30.0f, scaledTextSize); // Create a new TextView with the explicitly set configuration TextView textView = new TextView(context); textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledTextSize); // 30, because font size is scaled assertEquals(30.0f, textView.getTextSize()); // This is what we *don't* want, it's scaled *twice*! textView.setTextSize(scaledTextSize); assertEquals(60.0f, textView.getTextSize()); // DP instead of SP tests float fifteenDp = context.getResources().getDimensionPixelSize(R.dimen.dp_15); assertEquals(15.0f, fifteenDp); textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, fifteenDp); // Still 15, because it's DP, not SP assertEquals(15.0f, fifteenDp); textView.setTextSize(fifteenDp); // 30, because setTextSize DOES font scaling assertEquals(30.0f, textView.getTextSize()); } } 

我发现的一个大问题是TextView.setTextSize(float) 应用了字体缩放 ,所以如果你传入的尺寸已经被标记为SP而不是DP,那么它将会接收两次字体缩放。