2

我有一个主要问题我正在处理几天。首先看需求是可以理解的。我将在下面以点形式尽可能简单地列出我的要求。

  1. 我有 5 部安卓手机。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 英寸中安装了这个应用程序。然后我用尺子测量圆的直径。想象一下圆的直径是“精确的”3cm。
  6. 现在我将它安装在我的其他手机中。
  7. 不幸的是,在我的 4.5 英寸手机中,圆的直径是 3.2 厘米。在 5 英寸手机中为 3.3 厘米。在 5.1 英寸的手机中是 2.8cm 等等。
  8. 但是我希望我的圆直径在每部手机中都是 3 厘米(正好 3 厘米)。

以上要求是我现在尝试了几天的东西。我尝试了以下操作以确保我得到一个在所有屏幕上都没有大小变化的圆圈。

  1. 使用ImageView- 我尝试使用ImageView并添加了一个圆形图像。我已经给定了宽度,高度。我已尝试在 、 等中设置值pxdpinches还尝试scalling了可用于ImageView. 还尝试将相同的图像放在drawable-nodpi文件夹中。尝试为所有尺寸创建可绘制文件夹(例如:drawable-mdpi、drawable-hdpi)。这些都不会阻止图像的缩放。
  2. 使用画布- 如上所述,我尝试使用画布并绘制图像。绘图比例。
  3. 查找每英寸像素。-尝试以编程方式查找每部手机的每英寸像素,我认为我可以找到一种方法来从中开发逻辑以动态绘制相同大小的图像。我使用了几个链接,包括 -计算 Android 设备的 PPI。他们中的大多数人只谈论获得屏幕分辨率。

如何满足绘制相同大小圆圈的要求?如果知道PPI就可以做到,我该怎么做呢?

4

2 回答 2

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 英寸高

那是正确的!

现在回到您的问题,让我们为任何 Phone 获取 3cm 像素:

以厘米为单位获取宽度:

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

获取每 cm 的像素数量:

以像素为单位的宽度/以厘米为单位的宽度 = 宽度为每厘米的像素数 (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;

最后,以上所有都经过我的测试和认可,并且与之前的答案方法具有相同的准确性:)

于 2016-05-18T14:03:45.203 回答
0

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

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

以上在 Nexus 5x 和 1889.7638 Nexus 5(模拟器)上给了我 1661.5354。两者都有全高清显示屏,但 5 有 4.95 英寸,而 5x 有 5.2 英寸。

这意味着 100 毫米在 6 上是 1662 像素,在 5x 上是 1890

于 2016-05-06T08:11:58.237 回答