Android:如何为不同大小/密度的设备在图像的不同部分绘制矩形 [英] Android: How to draw rectangle on different parts of an Image for different size/density devices

查看:57
本文介绍了Android:如何为不同大小/密度的设备在图像的不同部分绘制矩形的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我有一个尺寸为1080 x 1444px的资产sample.png。我正在创建一个自定义视图,该视图onDraw()将sample.png的位图涂黑,并围绕画布上的微笑图标进行矩形调整。

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

屏幕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)。

如果有人能给我提个解决方案或者举个例子,我将不胜感激。

谢谢您。

推荐答案

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

我想可能是因为我在所有不同密度的设备上使用相同的图像。也许我需要提供不同密度的可绘制-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
  }

任何帮助都是非常有用的。

这篇关于Android:如何为不同大小/密度的设备在图像的不同部分绘制矩形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆