【发布时间】:2012-07-28 00:54:42
【问题描述】:
我想使用Canvas 在视图上绘制具有特定高度(以像素为单位)的文本。您可以简单地将Paint.setTextSize(float) 与像素数一起使用,还是使用dp 或sp?
【问题讨论】:
标签: android units-of-measurement
我想使用Canvas 在视图上绘制具有特定高度(以像素为单位)的文本。您可以简单地将Paint.setTextSize(float) 与像素数一起使用,还是使用dp 或sp?
【问题讨论】:
标签: android units-of-measurement
它使用像素,但您可以使用以下代码将其转换为 dp:
double getDPFromPixels(double pixels) {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
switch(metrics.densityDpi){
case DisplayMetrics.DENSITY_LOW:
pixels = pixels * 0.75;
break;
case DisplayMetrics.DENSITY_MEDIUM:
//pixels = pixels * 1;
break;
case DisplayMetrics.DENSITY_HIGH:
pixels = pixels * 1.5;
break;
}
return pixels;
}
【讨论】:
getContext()获取Context,之后调用Context.getSystemService(Context.WINDOW_SERVICE)获取WindowManager。更多信息在这里developer.android.com/reference/android/view/WindowManager.html。
dp 是px/density。实际上,将switch 替换为pixels /= metrics.density 可以简化。
获取此类方法的 px 值的最简单方法是在 dimens.xml 文件中简单地定义适当的 dp 或 sp 值,然后像这样检索它:
int sizeInPx = context.getResources().getDimensionPixelSize(R.dimen.sizeInSp);
根据您的需要,您实际上可以使用 3 种方法:
getDimension() 返回一个以像素为单位的浮点数。
getDimensionPixelSize() 返回一个以像素为单位的整数。这与 getDimension() 相同,除了返回值被舍入到最接近的整数值,并确保非零输入值导致非零输出值(例如,0.1 返回为 1,而不是 0)。
getDimensionPixelOffset() 返回一个以像素为单位的整数。这与 getDimension() 相同,只是返回的值是 TRUNCATED(即向下舍入)。结果可能为零。
【讨论】:
22sp 文字在大屏幕上看起来不错(例如 Pixel XL - 1440x2560、560dpi)但在小屏幕上(例如 Nexus一 - 480x800 hdpi=240dpi)它甚至不可读。与例如myPaint.setTextSize(80) 文本在两个屏幕上看起来都不错,而且大小也大致相同(不同设备的大小总是存在某种差异,尽管它通常很小)。
R.dimen.textSize),画布会自动缩放(根据dpi,...),这是唯一真正有效的东西 - 没有其他建议用于计算文本大小。
这些方法包括DisplayMetrics,可以添加到未来的 Android SDK 中。
要下降的像素:
public static float getDipFromPixels(float px) {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_PX,
px,
Resources.getSystem().getDisplayMetrics()
);
}
下降到像素:
public static float getPixelsFromDip(float dip) {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dip,
Resources.getSystem().getDisplayMetrics()
);
}
【讨论】: