2011-03-20 103 views
29

对于我的Android游戏,我有一些拨打电话Canvas.drawText()Android:Canvas.drawText()在不同屏幕分辨率下的文字大小

为了测试,我使用标准字体大小似乎工作正常。

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

是否有一种简单的方法来计算文本应该绘制在什么尺寸或我必须手动执行此操作?

编辑:什么是editing my post @Suragch的要点?

+0

尝试使用[scaledDensity](http://developer.android.com/reference/android/util/DisplayMetrics.html#scaledDensity)? – 2011-03-20 12:10:02

+0

嗨Marcin,是的,我已经使用过,乘数似乎没有太大的作用。据我所知,我也正在使用正确的乘法逻辑。 – twig 2011-03-21 23:32:04

回答

75

最简单的方法是将带有刻度无关的像素的(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

+0

有趣的方法,我一定会尝试,当我有机会。 – twig 2011-03-21 23:33:23

+0

谢谢约瑟夫,就像一个魅力。我必须承认,我将它应用于错误的Paint对象,并在很久以后才意识到。 Marcin的解决方案也可以很好地工作。 – twig 2011-03-22 08:56:57

+0

约瑟夫,你是说ADD R.dimen.font_size并将其设置为20sp为例。那么通过调用这个20sp将被自动缩放到任何屏幕?或者我们是否必须为每个屏幕资源添加一些font_size尺寸? – HGPB 2012-07-17 11:44:24

4

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

int scaledSize = getResources().getDimensionPixelSize(R.dimen.font_size); 
mTextView.setTextSize(scaledSize); 

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

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

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

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

标签<dimen>name属性将被用作资源ID。

+1

http://developer.android.com/guide/topics/resources/more-resources.html#Dimension 我明白了。 – Trung 2011-06-23 07:17:13

1

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

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

你需要计算吸引你的文字一样的大小,任何画布大小的关系,所以用实际的画布大小,像这样:

0

你可以用一个简单的数学运算自己做

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

但这个数字仅仅是太大,所以由一个适合您的需要将其划分,可以说250:

relation = relation/250; 

现在,您可以设置文字大小是这样的:

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

您不必通过任何必要的鸿沟关系,但在这种情况下,你将不得不使用非常小的字体大小可变myFontSize。对于我来说,250个作品可以很好地使用常规字体大小,可以适应任何屏幕大小,因为您已经在计算画布中的像素尺寸。