如何使用Java代码在sp值中分配文本大小


205

如果我分配一个整数值以TextView使用Java代码更改的某个文本大小,则该值将解释为pixel(px)。

现在有人知道如何分配它sp吗?

Answers:


535

18
由于SP代表按比例缩放的像素,因此您需要通过屏幕密度来减小尺寸。可以很容易地做到如下:SCREEN_DENSITY = getResources()。getDisplayMetrics()。density; yourView.setTextSize(TypedValue.COMPLEX_UNIT_SP,(desiredTextHeightInSP / SCREEN_DENSITY);
PeteH 2014年

4
当我尝试从资源中收集SP时,该解决方案对我不起作用。PeteH,您让我步入正轨!以下是对我有用的技巧:... float textSize = getResources()。getDimension(R.dimen.textsize)/ getResources()。getDisplayMetrics()。density; myTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,textSize);
P Kuijpers,2014年

52
如果从资源中获取sp大小,则应使用COMPLEX_UNIT_PX,如下所示:以textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));这种方式获取文本大小已经将SP转换为PX,同时考虑了屏幕密度和文本比例因子。
Ciske Boekelo

如图所示,提供的解决方案对我有效。谢谢!
Martin Erlic

35

您可以使用DisplayMetrics对象像素和缩放的像素与之间帮助转换scaledDensity属性

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 

1
这将考虑屏幕密度比例因子,而不考虑用户可能通过设置指定的文本比例因子。我相信@Santosh的解决方案将考虑到此因素,而此代码段没有考虑。
greg7gkb

3
但是有时您无法使用@Santosh方法,例如在将Paint写入画布时。然后,此方法很方便并且效果很好,因此请为这两个答案表示赞许!
byemute

1
@ greg7gkb不是正确的,文档说,may be adjusted in smaller increments at runtime based on a user preference for the font size因此考虑字体大小。
卡·维图奇

32

更清洁,更可重用的方法是

dimens.xml目录内的文件中定义文本大小res/values/

</resources>
   <dimen name="text_medium">14sp</dimen>
</resources>

然后将其应用于TextView

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));

20

基于以下源代码setTextSize

public void setTextSize(int unit, float size) {
    Context c = getContext();
    Resources r;

    if (c == null)
        r = Resources.getSystem();
    else
        r = c.getResources();

    setRawTextSize(TypedValue.applyDimension(
        unit, size, r.getDisplayMetrics()));
}

我建立了此功能来计算对像素的任何尺寸:

int getPixels(int unit, float size) {
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    return (int)TypedValue.applyDimension(unit, size, metrics);
}

那里的单位是这样的TypedValue.COMPLEX_UNIT_SP


最后一种方法是挽救生命。
Ajibola 2014年

12

默认情况下,setTextSize(无单位)在SP中工作(比例像素)

public void setTextSize (float size) 
Added in API level 1
Set the default text size to the given value, interpreted as "scaled pixel" units. This 
size is adjusted based on the current density and user font size preference.

11

谢谢@John Leehey和@PeterH:

desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);

问题是,如果您在dimen.xml中将R.dimen.desired_sp定义为25

  1. 在非高清设备上:desireSp仍为25,密度= 1
  2. 在高清设备(如Nexus 7第2代)上:desireSp变为50 ish,密度= 2

11

当接受的答案不起作用时(例如,在处理Paint时),您可以使用:

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);

好的,它能正常工作,这就是我想要的,感谢pomber的分享!
Park Eun Neul

8
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))

请说明将文本大小设置为像素值(COMPLEX_UNIT_PX)会如何帮助。OP希望“在sp值中分配文本大小”
Blau Macht Blau

如果使用COMPLEX_UNIT_PX,则需要划分密度。
William Hu

我认为这是因为getDimension已将“ dp”转换为“ px”
Ali Mousavi Kherad


0

在尝试了所有解决方案之后,没有一个给出令人满意的结果(可能是因为我正在使用具有默认超大字体的设备),以下对我有用(COMPLEX_UNIT_DIP =设备独立像素):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

0

从Api级别1,您可以使用public void setTextSize (float size)方法。

从文档中:

将默认文本大小设置为给定值,以“缩放像素”为单位。根据当前密度和用户字体大小首选项调整此大小。

参数:size-> float:缩放的像素大小。

因此,您可以简单地执行以下操作:

textView.setTextSize(12); // your size in sp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.