如何使用java代码在sp值中指定文本大小

时间:2010-01-15 06:15:19

标签: android textview text-size

如果我指定一个整数值来使用java代码更改TextView的某个文本大小,则该值将被解释为pixel(px)。现在有谁知道如何在sp?

中分配它

12 个答案:

答案 0 :(得分:490)

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

示例:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

答案 1 :(得分:35)

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

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

答案 2 :(得分:30)

更清洁,更可重用的方法

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));

答案 3 :(得分:19)

基于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

答案 4 :(得分: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.

答案 5 :(得分:10)

谢谢@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 2nd Generation): desiredSp变为50 ish,密度= 2

答案 6 :(得分:9)

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

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

答案 7 :(得分:7)

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

答案 8 :(得分:2)

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

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

答案 9 :(得分:0)

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

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

答案 10 :(得分:0)

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

从文档中:

  

将默认文本大小设置为给定值,解释为“缩放”   像素”单位。此尺寸是根据电流密度和   用户字体大小首选项。

     

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

所以您可以简单地做:

textView.setTextSize(12); // your size in sp

答案 11 :(得分:-1)

如果有人正在寻找Kotlin方式,你可以做

view.textSize = 12f