TextView.setTextSize行为异常 - 如何为不同屏幕动态设置textview的文本大小
调用TextView.setTextSize()
工作异常。在setTextSize
的电话后面,如果我们得到getTextSize
,它会返回一个更高的值,这是我们之前设置的值。TextView.setTextSize行为异常 - 如何为不同屏幕动态设置textview的文本大小
下面是我们正在做的事情:
zoomControl.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View view) {
float size = mViewShabad.getTextSize() + 1;
textView.setTextSize(size);
}
});
有没有人见过这个?
这里的区别在于,在setTextSize(int size)
方法中,默认的单位类型是“sp”或“缩放像素”。该值对于每个屏幕密度(ldpi,mdpi,hdpi)都是不同的像素尺寸。
getTextSize()
另一方面返回文本的实际像素尺寸。
您可以使用setTextSize(int unit, float size)
指定单位类型。造成这种情况的常数值可以在的TypedValue类中找到,但其中一些是:
TypedValue.COMPLEX_UNIT_PX //Pixels
TypedValue.COMPLEX_UNIT_SP //Scaled Pixels
TypedValue.COMPLEX_UNIT_DIP //Device Independent Pixels
这个问题happend因为getTextSize()
方法返回的像素尺寸取决于屏幕密度!以获得实际TEXTSIZE使用这样的:
DisplayMetrics metrics;
metrics = getApplicationContext().getResources().getDisplayMetrics();
float Textsize =myTextView.getTextSize()/metrics.density;
myTextView.setTextSize(Textsize+1);
我希望它解决它:)
我用显示器的指标与'setTextSize(INT单元,浮点大小)'解决我的问题。 – 2013-07-30 09:35:53
如果设置更改字体大小,什么原因显示错误,你可以做:
setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);
谁在'DIP'设置TEXTSIZE? – 2015-10-29 22:55:49
当我们尝试使用getTextSize()设置setText()程序性问题,并返回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的比例与1.5F
means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f));
总之替换值,如果你想缩小你的TEXTSIZE
float size = mViewShabad.getTextSize()*1.1f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
因为getTextSize()返回UNIT_PX,那么我们应该使用UNIT_PX
添加一些额外的这个答案的味道,也遇到了一些混乱。你应该能够把这个测试放到你项目中的任何@RunWith(AndroidJUnit4.class)
测试中(你还需要将dimens添加到你的dimens.xml中)。
注:所有这些测试都通过了
@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,那么它将会接收字体缩放两次。
您正在获取并设置两个不同对象的文本大小? – 2010-09-10 18:15:42