2010-09-10 77 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,那麼它將會接收字體縮放兩次

相關問題