【发布时间】:2011-03-04 23:10:51
【问题描述】:
是否可以更改Paint.setTextSize() 的单位?据我所知,它是像素,但我喜欢在 DIP 中设置文本大小以支持多屏幕。
【问题讨论】:
是否可以更改Paint.setTextSize() 的单位?据我所知,它是像素,但我喜欢在 DIP 中设置文本大小以支持多屏幕。
【问题讨论】:
接受的答案是手势,而不是设置文本大小。投票最高的答案(在撰写本文时)已接近,但文档建议使用 sp 而不是 dp,因为除了针对屏幕密度(如 dp 值)进行缩放外,sp 是还根据用户首选的字体大小进行缩放。
来自代码中的int
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 的“字体大小”设置缩放。
dp 值设置为80 是否与使用myPaint.setTextSize(80) 产生相同的结果?
dp 而不是 sp?我刚刚也用dp 对其进行了测试,但我得到了相同的结果:22sp/22dp 给我appr。与myPaint.setTextSize(80) 的结果相同——至少对于更大的 Pixel XL。在较小的 Nexus One 上,文本太小而无法阅读。
如果您的 Paint 对象用于在 Canvas 上绘制文本,您可以让 Canvas 为您处理缩放。
调用Canvas.drawText()时,文本大小首先由传入的Paint对象确定,可以通过Paint.setTextSize()设置。文字大小会根据画布密度自动缩放Canvas,可以使用Canvas.getDensity()找到。
在将要在 Canvas 上绘制的绘制对象上设置文本大小时,请使用 dp 或 sp 的单位值,并让 Canvas 为您处理缩放。
【讨论】:
Paint.setTextSize(float textSize) 中,textSize 是一个像素值。在我看来,这似乎并不能确定它会自动缩放。如果确实如此,那么我认为文档会说单位是 sp 或 dp 而不是像素。
Canvas.drawText() 设置地图标记。我测试了不同的解决方案,但像getDimensionPixelSize(R.dimen.fontSize) 这样的建议不能正常工作:<dimen name="fontSize">22sp</dimen> 在 Pixel XL(1440x2560、560dpi)上看起来不错,在 Nexus 4(768x1280,xhdpi=320dpi)上它明显更小,但在 Nexus One 上(480x800,hdpi=240dpi)它很小/不可读了。 TextViews 会自动缩放,但画布也会处理某些缩放:它不会对 Android 字体设置的更改做出反应,但会确保每个设备上的文本大小相同(例如 0.5" 宽)。跨度>
像这样转换它
// 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
【讨论】:
在考虑显示指标的情况下,这是将 dp-s 转换为 px-els 的更短的方法
【讨论】:
我知道这个话题已经过时并且已经回答了,但我也想推荐这段代码:
int MY_DIP_VALUE = 5; //5dp
int pixel= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
MY_DIP_VALUE, getResources().getDisplayMetrics());
【讨论】: