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

Posted

技术标签:

【中文标题】如何使用java代码在sp值中分配文本大小【英文标题】:How to assign text size in sp value using java code 【发布时间】:2011-01-05 09:40:39 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

例子:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

【讨论】:

由于 SP 代表缩放的 像素,您需要按屏幕密度减小尺寸。它很容易完成如下: SCREEN_DENSITY = getResources().getDisplayMetrics().density; yourView.setTextSize(TypedValue.COMPLEX_UNIT_SP, (desiredTextHeightInSP / SCREEN_DENSITY); 当我尝试从资源中收集 SP 时,该解决方案对我不起作用。 PeteH,你让我走上了正轨!以下对我有用: ... float textSize = getResources().getDimension(R.dimen.textsize) / getResources().getDisplayMetrics().density; myTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize); 如果您从资源中获取 sp 大小,则应使用 COMPLEX_UNIT_PX,如下所示:textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp)); 以这种方式获取文本大小已经将 SP 转换为 PX,同时采用屏幕密度和文本比例因子在帐户中。 提供的解决方案对我有用,如图所示。谢谢! 实际答案是为我做的,我不知道为什么,但来自 cmets 的建议使我的文本在尝试设置 sp tp 11 时变得微观【参考方案2】:

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

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

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

然后将其应用到TextView:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

这将考虑屏幕密度缩放因子,但不考虑用户可能通过设置指定的文本缩放因子。我相信@Santosh 的解决方案会考虑到这个因素,而这个 sn-p 没有。 但有时你无法使用@Santosh 的方法,例如当你将Paint 写入画布时。那么这个方法就派上用场了,效果也很好,所以对这两个答案点赞! @greg7gkb 不正确,文档显示may be adjusted in smaller increments at runtime based on a user preference for the font size,因此考虑字体大小。【参考方案4】:

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

【讨论】:

最后一种方法是救命稻草。【参考方案5】:

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

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

【讨论】:

好的,它工作,这就是我想要的,感谢pomber分享它!【参考方案6】:

默认情况下 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.

【讨论】:

【参考方案7】:

感谢@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

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

【讨论】:

【参考方案8】:
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))

【讨论】:

请解释将文本大小设置为像素值 (COMPLEX_UNIT_PX) 会有什么帮助。 OP想要“在sp值中分配文本大小” 如果你使用COMPLEX_UNIT_PX你需要划分密度。 我认为这是因为 getDimension 已经将 'dp' 转换为 'px'【参考方案9】:

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

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

【讨论】:

【参考方案10】:

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

来自文档:

将默认文本大小设置为给定值,解释为“缩放 像素”单位。这个大小是根据电流密度和 用户字体大小偏好。

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

所以你可以简单地做:

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

【讨论】:

【参考方案11】:

在尝试了所有解决方案但都没有给出可接受的结果(可能是因为我在使用默认非常大字体的设备上工作)后,以下方法对我有用(COMPLEX_UNIT_DIP = 设备独立像素):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

【讨论】:

以上是关于如何使用java代码在sp值中分配文本大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中分配类内数组的可修改大小

如何在代码中分配动态资源样式?

在 JME 中拆分文本并在数组中分配值

如何在一个表的键中分配多个值?

如何在测试中使用在 beforeAll() 钩子中分配了值的变量

如何在模板类函数中分配struct值?