Paint.setTextSize(float)使用的是哪个度量单位?

14

我想使用Canvas在一个视图上绘制指定高度(以像素为单位)的文本。您是否可以使用Paint.setTextSize(float)来设置像素数量,或者它是使用dpsp的?

3个回答

14

它使用像素,但是您可以使用此代码将其转换为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;
}

@Todd Davies - 我该如何在自定义视图类中使用它?无法使用getWindowManager()。 - Neil
1
@Neil - 您可以使用View的方法 getContext() 来获取 Context,然后您可以调用 Context.getSystemService(Context.WINDOW_SERVICE) 来获取 WindowManager。更多信息请参见此处:http://developer.android.com/reference/android/view/WindowManager.html。 - Tzoiker
3
顺便提一下,答案不正确,“dp”应该是“px / 密度”。实际上,可以通过将“switch”替换为“pixels /= metrics.density”来简化它。 - Tzoiker
@Tzoiker,您能否详细解释一下?我不知道我应该改变什么。 - natario
@m iav,请使用 pixels /= metrics.density 替换整个 switch - Tzoiker
你的函数返回了double类型,但应该是float类型。 - JuliaKo

8

对于此类方法获取px值的最简单方法是,在dimens.xml文件中定义适当的dp或sp值,并像这样检索它:

int sizeInPx = context.getResources().getDimensionPixelSize(R.dimen.sizeInSp);

根据您的需求,有三种可用的方法:

  • getDimension()返回一个以像素为单位的浮点数。

  • getDimensionPixelSize()返回一个以像素为单位的整数。与getDimension()相同,但返回的值四舍五入到最近的整数值,并确保非零输入值产生非零输出值(例如0.1将作为1而不是0返回)。

  • getDimensionPixelOffset()返回一个以像素为单位的整数。与getDimension()相同,但返回的值截断(即向下取整)。结果可能为零。


1
这是最佳答案;它在所有现有设备上都能正常工作,并且将在未来的设备上继续工作(Todd Davies的答案缺少新的密度,如xhdpi、xxhdpi等)。这也更加灵活,您可以为不同的屏幕尺寸(平板电脑等)提供替代的dimens.xml文件,或根据需要在dp和sp之间进行更改。 - NaxyMatt
1
是的,这个TheIT的答案是最好的答案,正如WanderingLinguist所说,因为Todd Davies的解决方案应该更新,包括xHigh、xxhigh和xxxhigh以及电视等未来可能出现的情况,这表明它很复杂,容易出错,而不是TheIT的答案,它现在和将来都可以工作,即使出现任何设备,Android也计划处理所有类型的设备密度。 - Reijo Korhonen
@neph 我看到你在另一个答案上问了同样的问题,我能想到的唯一可能是你正在绘制的画布/位图被缩放了,因为setTextSize()方法使用像素单位,所以在Nexus One上,80的值应该看起来非常大。祝你好运! - TheIT
@Neph,画布肯定不会自动缩放 - 我猜测你正在创建一个固定大小的画布(例如2kx2k),然后渲染一个固定大小的字体(80),然后在视图上显示这个画布,该视图将缩放画布以适应相对于屏幕空间的大小(例如屏幕的50%或match_parent)。正确的方法是创建一个根据屏幕DPI调整大小的画布(例如,对于hdpi设备,它可能是512x512),这将需要一个依赖于DPI的文本大小。 - TheIT
@TheIT 我使用在运行时下载的图像位图创建画布。该图像大小为2k x 2k(不是我的图像,因此无法更改),画布也是如此。我还在PhotoView(Chris Bane's)中使用相同的位图,以便能够缩放...该图像。我之前意外地使用了较小的画布,但它没有在正确的位置绘制东西。感谢您提供“正确方法”的提示,我会在有时间时尝试它,但现在我将保留它,因为最终它可以在不同的设备上工作,这正是我想要的。;) - Neph
显示剩余2条评论

1
这些方法包括可以添加到未来Android SDK中的DisplayMetrics

像素转换为dip:

public static float getDipFromPixels(float px) {
        return TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_PX,
                px,
                Resources.getSystem().getDisplayMetrics()
        );
}

将Dip转换为像素:

public static float getPixelsFromDip(float dip) {
        return TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, 
                dip,
                Resources.getSystem().getDisplayMetrics()
        );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接