Android图形:绘制相同大小的圆圈

时间:2016-05-06 08:02:21

标签: android canvas ppi

我有一个主要问题,我现在正在工作几天。首先查看要求是很容易理解的。我将在下面的点表格中尽可能简单地列出我的要求。

  1. 我有5款Android手机。 5种不同的品牌,不同的屏幕尺寸。
  2. 想象一下屏幕尺寸为4英寸,4.5英寸,5英寸,5.1英寸和5.2英寸
  3. 我有一个Android应用程序,它有一个绘图画布。
  4. 现在使用canvas.drawCircle(x / 2, y / 2, radius, paint)我画了一个圆圈。想象一下半径是100(100像素?)
  5. 我用最小的屏幕手机4英寸安装了这个应用程序。然后我用尺子测量圆直径。想象一下,圆直径是"精确" 3厘米。
  6. 现在我在其他手机上安装它。
  7. 不幸的是,在我的4.5英寸手机中,圆圈直径为3.2厘米。在5英寸手机中它是3.3厘米。在5.1英寸手机中它是2.8厘米,依此类推。
  8. 但是我希望每个手机的圆圈直径为3厘米(精确到3厘米)。
  9. 以上要求是我现在正在努力的事情。我尝试了以下操作以确保在所有屏幕上都没有更改尺寸的圆圈。

    1. 使用ImageView - 我尝试使用ImageView并添加了圆圈图片。我给出了宽度,高度固定。我试过在pxdpinches等设置值。我还尝试了scalling ImageView个可用选项。还尝试将相同的图像放在drawable-nodpi文件夹中。尝试为所有尺寸创建可绘制文件夹(例如:drawable-mdpi,drawable-hdpi)。这不会阻止图像缩放。
    2. 使用画布 - 如上所述,我尝试使用画布并绘制图像。绘图比例。
    3. 查找每英寸像素 .-尝试以编程方式查找每部手机每英寸的像素数我可以找到一种方法从中开发逻辑以动态绘制相同大小的图像。我使用了几个链接,包括 - Calculate PPI of Android Device。他们中的大多数人只谈论获得屏幕分辨率。
    4. 我如何满足绘制相同尺寸圆圈的要求?如果可以通过了解PPI来完成,我该怎么做?

2 个答案:

答案 0 :(得分:1)

之前的答案对我有用,但只要它不适合你,我会尝试解释我认为有用的东西。

我的设备密度为1(每英寸160像素),显示器指标告诉我,我有320 * 480像素,通过简单的计算,我应该知道我的移动宽度和高度,以英寸为单位: 320/160 =宽2英寸,480/160 = 3。现在一切都很好,直到我得到了统治者并测量它并且出乎意料的是:我有1.65 * 2.48英寸!!。

然后我注意到屏幕上每英寸有一个叫做物理像素的东西,这对我来说是一种解脱,你可以这样得到它:

getResources().getDisplayMetrics().xdpi;  //for width physical dpi
getResources().getDisplayMetrics().ydpi;  //for height physical dpi

现在我可以像这样计算我的设备的物理宽度和高度:

宽度和高度的物理dpi是193.5238所以......

320 / 193.5238 = 1.65英寸宽 480 / 193.5238 = 2.48英寸高度

这是正确的!!。

现在回到你的问题,让任何手机获得3厘米的像素:

以cm为单位获取宽度:

宽度(cm)=宽度(英寸)* 2.54(因为1英寸等于2.54厘米)

获取每个cm中的像素数量:

宽度(以像素为单位)/宽度(cm)=每厘米像素宽度(px / cm)

现在你需要一个3厘米,然后根据它的像素是:

3 *数量= 3厘米像素

以上所有内容都可以缩短为:

float devicePixelsWidth = getResources().getDisplayMetrics().widthPixels;
float deviceActualDpi = getResources().getDisplayMetrics().xdpi ;
float deviceActualInchWidth = devicePixelsWidth / deviceActualDpi ;
float deviceActualCMWidth = deviceActualInchWidth * 2.54f ;

float PixelsForActual3CM = devicePixelsWidth / deviceActualCMWidth * 3;

最后,所有上述内容均经过我的测试和批准,并具有与之前的答案方法相同的准确度:)

答案 1 :(得分:0)

也许这不是答案,但可能会有所帮助

float _100MmAsPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM,
    100/*mm unit set*/, getResources().getDisplayMetrics());

上面给出了Nexus 5x的1661.5354和Nexus 5的1889.7638(仿真器)。两者都有全高清显示屏,但5英寸显示为4.95英寸,而5英寸显示为5.2英寸。

这意味着100毫米是6,662和1690像素,5x