【问题标题】:Android Graphics: Drawing same size circlesAndroid图形:绘制相同大小的圆圈
【发布时间】:2016-05-06 08:02:20
【问题描述】:

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

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

我已经尝试了好几天了。我尝试了以下方法以确保我得到一个在所有屏幕上都没有大小变化的圆圈。

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

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

【问题讨论】:

    标签: android canvas ppi


    【解决方案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 英寸高

    那是正确的!!。

    现在回到你的问题,让我们为任何手机获取 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;
    

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

    【讨论】:

      【解决方案2】:

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

      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 像素

      【讨论】:

      • 它的整数变化,COMPLEX_UNIT_MM(毫米)到像素(总是)。
      • 我的意思是它是每英寸像素数吗?
      • 所以要使用它,我实际上需要的是宽度,而不是长度,因为我会画一个圆,而直径是宽度。
      • 您需要以像素为单位的适当半径才能在Canvas 上绘图。 float _30MmAsPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 30, getResources().getDisplayMetrics()); 为您提供 30 毫米像素单位,具体取决于设备密度/尺寸/分辨率。只需使用_30MmAsPx/2 作为半径。现在您为半径(假设)提供固定的 100 像素,这在具有相同分辨率但屏幕尺寸不同的设备上可能略有不同。上面的行从给定的 mm 计算适当的 px 值
      • 我试过给 20mm。根据生成的值绘制圆时,直径为3.3CM!
      猜你喜欢
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2018-03-21
      • 2022-11-03
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2013-10-30
      相关资源
      最近更新 更多