230

如果我分配一个整数值来更改使用 java 代码的某个文本大小TextView,则该值被解释为像素 ( px)。

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

4

11 回答 11

579

http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29

例子:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
于 2011-08-19T07:37:45.120 回答
41

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

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));
于 2016-09-15T09:56:30.547 回答
37

您可以使用DisplayMetrics对象来帮助在像素和缩放像素之间进行转换,并使用scaledDensity属性

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 
于 2010-01-15T06:42:32.097 回答
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.

于 2013-02-26T06:50:19.057 回答
15

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

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
于 2015-02-14T16:23:37.453 回答
13

默认情况下 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.
于 2013-02-11T23:20:49.623 回答
12

谢谢@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. 在非高清设备上:desiredSp 仍为 25,密度 = 1
  2. 在高清设备上(如 Nexus 7 第二代):desiredSp 变为 50 ish,密度 = 2
于 2015-03-30T15:01:54.713 回答
9
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))
于 2016-09-20T09:50:00.930 回答
4

这是将PX转换为SP格式的代码。100% 有效

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
于 2017-03-14T16:53:22.410 回答
2

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

从文档中:

将默认文本大小设置为给定值,解释为“缩放像素”单位。此大小根据当前密度和用户字体大小偏好进行调整。

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

所以你可以简单地做:

textView.setTextSize(12); // your size in sp
于 2019-07-14T13:45:50.893 回答
1

在尝试了所有解决方案并且没有给出可接受的结果之后(可能是因为我正在使用默认非常大字体的设备),以下对我有用(COMPLEX_UNIT_DIP = Device Independent Pixels):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
于 2018-10-04T14:35:38.920 回答