我有一个主要问题,我已经处理了好几天了。先看需求就很好理解了。我将在下面的表格中尽可能简单地列出我的要求。
- 我有 5 部安卓手机。 5 个不同的品牌,不同的屏幕尺寸。
- 假设屏幕尺寸为 4 英寸、4.5 英寸、5 英寸、5.1 英寸和 5.2 英寸
- 我有一个 Android 应用程序,它有一个绘图 Canvas 。
- 现在使用
canvas.drawCircle(x/2, y/2, radius, paint)
我正在画一个圆。假设半径为 100(100 像素?) - 我在我的最小屏幕手机(4 英寸)上安装了这个应用程序。然后我用尺子测量圆的直径。想象圆的直径“精确”为 3 厘米。
- 现在我将它安装在我的其他手机上。
- 不幸的是,在我的 4.5 英寸手机中,圆直径为 3.2 厘米。在 5 英寸手机中为 3.3 厘米。 5.1寸的手机是2.8cm等等。
- 但是我希望每部手机的圆直径都是 3 厘米(精确到 3 厘米)。
上述要求是我几天来一直在尝试的。我尝试了以下操作以确保我得到一个在所有屏幕上都没有大小变化的圆圈。
- 使用
ImageView
- 我尝试使用ImageView
并添加了一个圆形图像。我已经给定了宽度,高度。我已经尝试在px
、dp
、inches
等中设置值。我还尝试了scalling
选项可用于ImageView
。还尝试将相同的图像放在drawable-nodpi
文件夹中。尝试为所有尺寸创建可绘制文件夹(例如:drawable-mdpi、drawable-hdpi)。这些都不能阻止图像被缩放。 - 使用 Canvas - 如上文所述,我尝试使用 Canvas 绘制图像。绘图比例。
- 查找每英寸像素。- 尝试以编程方式查找每部手机的每英寸像素,认为我可以找到一种方法来从中开发逻辑以动态绘制相同大小的图像。我使用了几个链接,包括 - Calculate PPI of Android Device .他们中的大多数人只谈论获得屏幕分辨率。
如何实现绘制相同大小圆圈的要求?如果知道PPI就可以做到,我应该怎么做?
最佳答案
之前的答案对我有用,但只要对您不起作用,我会尝试解释一些我认为会有所帮助的内容。
我有一个密度为 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 英寸高度
这是正确的!!
现在回到您的问题,让我们为任何手机获取 3cm 像素:
获取以厘米为单位的宽度:
以厘米为单位的宽度 = 以英寸为单位的宽度 * 2.54(因为 1 英寸等于 2.54 厘米)
获取每厘米的像素数量:
以像素为单位的宽度/以厘米为单位的宽度 = 宽度每厘米的像素数 (px/cm)
现在你想要一个 3cm 那么根据它的像素是:
3 * 数字 = 3cm 像素
以上所有内容都可以这样缩短:
float devicePixelsWidth = getResources().getDisplayMetrics().widthPixels;
float deviceActualDpi = getResources().getDisplayMetrics().xdpi ;
float deviceActualInchWidth = devicePixelsWidth / deviceActualDpi ;
float deviceActualCMWidth = deviceActualInchWidth * 2.54f ;
float PixelsForActual3CM = devicePixelsWidth / deviceActualCMWidth * 3;
最后,以上所有都经过我的测试和认可,与之前的回答方法具有相同的准确性:)
关于Android 图形 : Drawing same size circles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37067271/