如果我分配一个整数值来更改使用 java 代码的某个文本大小TextView
,则该值被解释为像素 ( px
)。
现在有人知道如何分配它sp
吗?
http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29
例子:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
更清洁和更可重用的方法是
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));
您可以使用DisplayMetrics
对象来帮助在像素和缩放像素之间进行转换,并使用scaledDensity
属性。
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity;
基于以下源代码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
.
当接受的答案不起作用时(例如在处理 Paint 时),您可以使用:
float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
默认情况下 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.
谢谢@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
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
context.getResources().getDimension(R.dimen.text_size_in_dp))
这是将PX转换为SP格式的代码。100% 有效
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
从 Api 级别 1 开始,您可以使用该public void setTextSize (float size)
方法。
从文档中:
将默认文本大小设置为给定值,解释为“缩放像素”单位。此大小根据当前密度和用户字体大小偏好进行调整。
参数: size -> float:缩放后的像素大小。
所以你可以简单地做:
textView.setTextSize(12); // your size in sp
在尝试了所有解决方案并且没有给出可接受的结果之后(可能是因为我正在使用默认非常大字体的设备),以下对我有用(COMPLEX_UNIT_DIP = Device Independent Pixels):
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);