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,那么它将会接收两次字体缩放。
- Android可绘制目录是否可以包含子目录?
- 当ViewPager的父代片段隐藏然后显示ViewPager的片段的视图丢失
- 有没有一个使用Android v2.0的PopupWindow类的简单例子?
- LocationRequest setInterval(long millis)和LocationRequest setFastestInterval(long millis)之间的区别
- 在android中使用arrayadapter类定制listview
- Android SDK Manager将不会更新:拒绝连接到https://dl-ssl.google.com
- 你如何获得Spinner的选定价值?
- 将JSONObject传递给另一个活动
- 音量变化是否有播放动作?