Android: How to draw rectangle on different parts of an Image for different size/density devices(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:如何为不同大小/密度的设备在图像的不同部分绘制矩形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Android:如何为不同大小/密度的设备在图像的不同部分绘制矩形
基础教程推荐
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01