我的应用程序在
ImageView
中有一个 LinearLayout
。目前,它会将照片放置在 ImageView
中,通过设置 AspectRatio
保留照片的 ScaleType.CENTER_INSIDE
。正确地,这会导致显示的背景颜色矩形位于照片的上方或下方(或左侧或右侧)。
现在,我想在整个
ImageView
区域(即照片加上两个背景矩形)上放置一个参考网格。问题是确定整个 ImageArea 的 width
和 height
来构建将占据 ImageView
的网格位图。我可以构建一个 1000 x 1000 位图网格并将其放置在带有 ImageView
的 ScaleType.FIT_XY
中,但是在将照片添加到该方形位图时我无法保留照片的 AspectRatio
。
理想情况下,我想在现有照片上写一个适当缩放的网格。
创建一个自定义 Drawable 来绘制网格并将其覆盖在 ImageView 上。这允许网格随着 ImageView 精确缩放。
以下是定义和应用此叠加层的方法:
class GridOverlayDrawable(private val cellSize: Float, private val color: Int) : Drawable() {
private val paint = Paint().apply {
color = [email protected]
strokeWidth = 2f
}
override fun draw(canvas: Canvas) {
val width = bounds.width()
val height = bounds.height()
for (x in 0..width step cellSize.toInt()) {
canvas.drawLine(x.toFloat(), 0f, x.toFloat(), height.toFloat(), paint)
}
for (y in 0..height step cellSize.toInt()) {
canvas.drawLine(0f, y.toFloat(), width.toFloat(), y.toFloat(), paint)
}
}
override fun setAlpha(alpha: Int) { paint.alpha = alpha }
override fun setColorFilter(colorFilter: ColorFilter?) { paint.colorFilter = colorFilter }
override fun getOpacity() = PixelFormat.TRANSLUCENT
}
然后,将此可绘制对象设置为 ImageView 上的叠加层:
val gridOverlay = GridOverlayDrawable(cellSize = 20f, color = Color.LTGRAY)
imageView.overlay.add(gridOverlay)
如果 ImageView 尺寸与图像不完全匹配,请调整单元格大小或使用矩阵变换以确保网格与缩放后的图像对齐。