如何使用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值中分配文本大小的主要内容,如果未能解决你的问题,请参考以下文章