在Paint.setTextSize()
中更改单位是否可能?据我所知,它是以像素为单位的,但我希望以DIP为单位设置文本大小以支持多屏幕。
我知道这个话题已经老旧并且已经有了答案,但我也想建议这段代码:
int MY_DIP_VALUE = 5; //5dp
int pixel= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
MY_DIP_VALUE, getResources().getDisplayMetrics());
按照以下方式进行转换
// The gesture threshold expressed in dip
private static final float GESTURE_THRESHOLD_DIP = 16.0f;
// Convert the dips to pixels
final float scale = getContext().getResources().getDisplayMetrics().density;
mGestureThreshold = (int) (GESTURE_THRESHOLD_DIP * scale + 0.5f);
// Use mGestureThreshold as a distance in pixels
从这里开始 http://developer.android.com/guide/practices/screens_support.html#dips-pels
接受的答案是关于手势的,而不是设置文本大小的。在撰写本文时,得票最高的答案接近正确,但文档建议使用sp
而不是dp
,因为除了被缩放以适应屏幕密度(像dp
值一样)之外,sp
还根据用户首选字体大小进行缩放。
从代码中的整数
int spSize = 17;
float scaledSizeInPixels = spSize * getResources().getDisplayMetrics().scaledDensity;
mTextPaint.setTextSize(scaledSizeInPixels);
或者另一种选择
int spSize = 17;
float scaledSizeInPixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
spSize, getResources().getDisplayMetrics());
mTextPaint.setTextSize(scaledSizeInPixels);
来自资源
或者如果您在资源中拥有sp
或dp
值:
<resources>
<dimen name="fontSize">17sp</dimen>
</resources>
随着
float scaledSizeInPixels = getResources().getDimensionPixelSize(R.dimen.fontSize);
mTextPaint.setTextSize(scaledSizeInPixels);
其他链接
myPaint.setTextSize(80)
),因为这样文本在每个设备上的实际宽度(例如0.5英寸)将是相同的(画布会缩放它!)- 即使它显然不会随着Android的“字体大小”设置而缩放。 - Nephdp
而不是sp
来使用<dimen name =“ fontSize”> 17sp </ dimen>
?我也试过用dp
,但两者的结果都相同:22sp
/22dp
给我的结果与myPaint.setTextSize(80)
几乎相同-至少对于更大的Pixel XL。在较小的Nexus One上,文本太小无法阅读。 - Neph如果你的Paint对象用于在Canvas上绘制文本,你可以让Canvas来处理缩放。
调用Canvas.drawText()
时,文本大小首先由传入的Paint
对象确定,该对象可以通过Paint.setTextSize()
设置。文本大小会根据Canvas的密度自动缩放,可以使用Canvas.getDensity()
进行查找。
在设置将要绘制在Canvas上的paint对象的文本大小时,请使用dp或sp作为单位,让Canvas为您处理缩放。
Paint.setTextSize(float textSize)
中,textSize
是以像素为单位的值。我不确定它是否会自动缩放。如果是的话,我认为文档应该说明单位是 sp
或 dp
而不是像素。 - SuragchCanvas.drawText()
设置地图标记。我尝试了不同的解决方案,但是像getDimensionPixelSize(R.dimen.fontSize)
这样的建议不能正常工作:<dimen name="fontSize">22sp</dimen>
在Pixel XL(1440x2560,560dpi)上看起来很好,在Nexus 4(768x1280,xhdpi=320dpi)上明显较小,但在Nexus One(480x800,hdpi=240dpi)上则非常小/无法阅读。TextView
会自动缩放,但画布也会处理某些缩放:它不会对Android的字体设置进行更改,但它会确保文本在每个设备上的大小相同(例如0.5英寸宽)。 - Neph这里有一种更简便的方法将dp转换为像素,同时考虑显示度量: