2010-09-10 75 views
98

调用TextView.setTextSize()工作异常。在setTextSize的电话后面,如果我们得到getTextSize,它会返回一个更高的值,这是我们之前设置的值。TextView.setTextSize行为异常 - 如何为不同屏幕动态设置textview的文本大小

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

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

有没有人见过这个?

+2

您正在获取并设置两个不同对象的文本大小? – 2010-09-10 18:15:42

回答

304

这里的区别在于,在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 
+0

我刚刚发现并即将在此发布。非常感谢! – singhspk 2010-09-10 18:54:36

+0

没问题! :)我也很好学习,哈哈。奇怪的是没有办法返回不同的值,但是我确信如果我研究它,这是一个简单的转换。 – kcoppock 2010-09-10 19:00:18

+1

我认为它实际上应该通过TypedValue(单数)。导入是android.util.TypedValue; – 2011-03-22 08:43:25

14

这个问题happend因为getTextSize()方法返回的像素尺寸取决于屏幕密度!以获得实际TEXTSIZE使用这样的:

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

我希望它解决它:)

+2

我用显示器的指标与'setTextSize(INT单元,浮点大小)'解决我的问题。 – 2013-07-30 09:35:53

7

如果设置更改字体大小,什么原因显示错误,你可以做:

setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f); 
+2

谁在'DIP'设置TEXTSIZE? – 2015-10-29 22:55:49

3

当我们尝试使用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)); 
1

总之替换值,如果你想缩小你的TEXTSIZE

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

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

0

添加一些额外的这个答案的味道,也遇到了一些混乱。你应该能够把这个测试放到你项目中的任何@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,那么它将会接收字体缩放两次

相关问题