【问题标题】:Android: Canvas.drawText() text size on different screen resolutionsAndroid:不同屏幕分辨率下的 Canvas.drawText() 文本大小
【发布时间】:2011-07-19 02:33:29
【问题描述】:

对于我的 Android 游戏,我有一些电话给 Canvas.drawText()

为了测试,我使用标准字体大小,看起来效果很好。

但是,当我将分辨率提高到更高的密度时,会自动加载较大的图像,但文本现在非常小。

有没有一种简单的方法来计算文本的绘制大小,或者我必须手动执行此操作?

编辑:editing my post@Suragch 的意义何在?

【问题讨论】:

  • 试过scaledDensity?
  • 嗨,Marcin,是的,我已经使用了它,乘数似乎没有多大作用。据我所知,我也在使用正确的乘法逻辑。

标签: android text size resolution drawtext


【解决方案1】:

您可以使用简单的数学运算自己完成:

您需要计算一个关系,以便为任何画布大小绘制相同大小的文本,因此请使用实际画布大小,如下所示:

double relation = Math.sqrt(canvas.getWidth() * canvas.getHeight());

但是这个数字太大了,所以除以一个适合您需要的数字,比如说 250:

relation = relation / 250;

现在您可以像这样设置文本大小:

paint.setTextSize((float) (myFontSize * relation));

您不必将关系除以任何数字,但在这种情况下,您必须为变量myFontSize 使用非常小的字体大小。对我来说 250 可以很好地使用可以调整到任何屏幕尺寸的常规字体大小,因为您已经在计算画布中的像素尺寸。

【讨论】:

  • 我用不同的模拟器(Nexus One=480x800 到 Nexus XL=1440x2560)测试了myPaint.setTextSize(80)(在canvas.drawText 之前调用)并且文本始终是相同的大小(例如始终为 1“现实生活" 屏幕上的厘米)。不确定这是否在某一时刻发生了变化(我使用的是 Java 8/API 27),但似乎不需要计算大小,因为画布会自动对其进行相应的缩放。
  • 更新:我现在用不同的模拟器测试了你的建议,但它没有给出想要的结果(不再?):例如字体大小 22(使用您的代码)在 Pixel XL(1440x2560、560dpi)上看起来不错,但在 Nexus One(480x800、hdpi=240dpi)上看起来很小/不再可读。
【解决方案2】:

调用Canvas.drawText()时,文本大小首先由传入的Paint对象确定,可以通过Paint.setTextSize()设置。文字大小会根据画布密度自动缩放Canvas,可以使用Canvas.getDensity()找到。

在将要在 Canvas 上绘制的绘制对象上设置文本大小时,请使用 dpsp 的单位值,并让 Canvas 为您处理缩放。

【讨论】:

    【解决方案3】:

    最简单的方法是在资源中使用与比例无关的像素 (sp) 单位来定义字体大小——这个单位类似于与密度无关的像素(dpdip),因为它需要考虑到屏幕密度,但也考虑到用户的字体大小设置。

    要添加新维度,请在您的 res/values 文件夹中创建一个 dimens.xml 文件,然后输入以下代码以添加名称为 myFontSize 的新维度:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <dimen name="myFontSize">20sp</dimen>
    </resources>
    

    然后您可以使用

    在您的应用程序中获取文本大小
    int scaledSize = getResources().getDimensionPixelSize(R.dimen.myFontSize);
    

    将根据当前屏幕密度和字体大小设置正确缩放生成的大小。

    有关详细信息,请参阅Android Developers page on More Resources

    【讨论】:

    • 很有趣的方法,有机会一定要试试。
    • 谢谢约瑟夫,这就像一个魅力。我必须承认我在错误的 Paint 对象上应用了它,并且在很久以后才意识到。 Marcin 的解决方案也可以正常工作。
    • Joseph,你是在说 ADD R.dimen.font_size 并将其设置为 20sp。然后通过调用这个 20sp 将自动缩放到任何屏幕?还是我们必须为每个屏幕分辨率添加一些 font_size 尺寸?
    • 我不明白为什么这不是默认行为。
    • 没有资源文件的类似方法stackoverflow.com/a/3062023/1815624
    【解决方案4】:

    最简单的方法是在资源目录中以scale-independent pixel (sp)density-independent pixel (dp) 为单位定义字体大小。然后使用

    获取文本大小
    int scaledSize = getResources().getDimensionPixelSize(R.dimen.font_size);
    mTextView.setTextSize(scaledSize);
    

    这将根据当前屏幕密度/分辨率和用户的字体大小设置适当地缩放文本大小。

    如何在资源目录中定义字体大小?

    在文件夹res-&gt;values 中创建一个名为dimens.xml 的文件。然后复制以下代码。

    <resources>
        <dimen name="font_size">25sp</dimen>   // sp or dp accordingly
    </resources>
    

    标签&lt;dimen&gt;name属性将用作资源ID。

    【讨论】:

    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2017-03-24
    • 2012-05-24
    相关资源
    最近更新 更多