本文介绍了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:如何为不同大小/密度的设备在图像的不同部分绘制矩形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!