【问题标题】:Android: How to draw rectangle on different parts of an Image for different size/density devicesAndroid:如何为不同尺寸/密度的设备在图像的不同部分绘制矩形
【发布时间】:2021-11-04 15:14:00
【问题描述】:

不是 Android 开发人员,而是在做个人项目,需要一些帮助。

我有一个尺寸为 1080 x 1444 像素的资产 sample.png。我正在创建一个自定义视图,onDraw() 对 sample.png 的位图和画布上的笑脸图标周围的矩形进行 darws。

这是在不同屏幕上创建视图时的外观。

屏幕 1:XXHDPI, 420, 2.625 (1080 x 2315 )

屏幕 2:XXXHDPI, 560, 3.5 (1440 x 3088 )

屏幕 3:XHDPI, 280, 1.75 (720 x 1544)

  override fun onDraw(canvas: Canvas) {
    super.onDraw(canvas)

    val bitmap = AppUtils.loadAssetAsBitmap(context, "sample.png")

    canvas.drawBitmap(bitmap, null, Rect(0, 0, width, height), paint)

    canvas.drawRect(RectF(400f, 220f, 580f, 400f), paint)
    canvas.drawRect(RectF(400f, 450f, 580f, 630f), paint)
    canvas.drawRect(RectF(400f, 680f, 580f, 860f), paint)
  }

问题在于使用硬编码的 Rect 坐标,这对于我针对屏幕 1 开发的设备效果很好,但由于密度和屏幕分辨率不同,因此不适用于其他屏幕 2 和 3。

我试图阅读和理解Support different pixel densities,但我仍然无法弄清楚我应该做什么。

sample.png 似乎在不同的屏幕上正确显示(很可能是 Android 正在缩放它,我不确定是否也应该为不同的密度提供 sample.png)。

如果有人可以建议我解决方案或提供示例,我将不胜感激。

谢谢。

【问题讨论】:

    标签: android coordinates scaling screen-density


    【解决方案1】:

    我添加了以下代码,根据设备的分辨率将硬编码坐标映射到新坐标。结果更好,但仍然不正确XXXHDPI, 560, 3.5 (1440 x 2560 )

    我认为这可能是因为我在不同密度的所有设备上使用相同的图像。也许我需要提供不同密度的 drawable-xxxx 或考虑屏幕对角线长度或完全新的解决方案。

    fun scaleRect(rect: RectF): RectF {
        val left = getX(rect.left)
        val top = getY(rect.top)
        val right = getX(rect.right)
        val bottom = getY(rect.bottom)
    
        return RectF(left, top, right, bottom)
      }
    
      // old-devie where hardcoded coordinates were taken from
      // current-device is the new target device
    
      fun getX(x: Float): Float {
        val oldDeviceWidth = 1080f
        val currentDeviceWidth = 720f
        return (x / oldDeviceWidth) * currentDeviceWidth
      }
    
      fun getY(y: Float): Float {
        val oldDeviceHeight = 2316f
        val currentDeviceHeight = 1544f
        return (y / oldDeviceHeight) * currentDeviceHeight
      }
    

    任何帮助都非常有用。

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 2018-01-27
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 2016-12-19
      • 2015-04-14
      • 1970-01-01
      相关资源
      最近更新 更多