问题
If I assign an integer value to change a certain text size of a TextView
using java code, the value is interpreted as pixel (px
).
Now does anyone know how to assign it in sp
?
回答1:
http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29
Example:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
回答2:
You can use a DisplayMetrics object to help convert between pixels and scaled pixels with the scaledDensity attribute.
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity;
回答3:
Cleaner and more reusable approach is
define text size in dimens.xml
file inside res/values/
directory:
</resources>
<dimen name="text_medium">14sp</dimen>
</resources>
and then apply it to the TextView
:
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));
回答4:
Based on the the source code of 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()));
}
I build this function for calulating any demension to pixels:
int getPixels(int unit, float size) {
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
return (int)TypedValue.applyDimension(unit, size, metrics);
}
Where unit is something like TypedValue.COMPLEX_UNIT_SP
.
回答5:
By default setTextSize, without units work in SP (scales pixel)
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.
回答6:
Thanks @John Leehey and @PeterH:
desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);
The thing is if you define R.dimen.desired_sp to 25 in your dimen.xml
- On non-HD Device: desiredSp is still 25, density = 1
- On HD Device(like Nexus 7 2nd Generation): desiredSp becomes 50 ish, density = 2
回答7:
When the accepted answer doesn't work (for example when dealing with Paint) you can use:
float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
回答8:
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
context.getResources().getDimension(R.dimen.text_size_in_dp))
回答9:
This is code for the convert PX to SP format. 100% Works
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
回答10:
From Api level 1, you can use the public void setTextSize (float size) method.
From the documentation:
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.
Parameters: size -> float: The scaled pixel size.
So you can simple do:
textView.setTextSize(12); // your size in sp
回答11:
After trying all the solutions and none giving acceptable results (maybe because I was working on a device with default very large fonts), the following worked for me (COMPLEX_UNIT_DIP = Device Independent Pixels):
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
回答12:
In case if anyone is looking for Kotlin way, you can do
view.textSize = 12f
来源:https://stackoverflow.com/questions/2069810/how-to-assign-text-size-in-sp-value-using-java-code