1

我试图用图像(平面图)和标记创建视图。我需要在用户点击的地方添加标记。这个标记应该是另一个视图,当用户缩放 ImageView 时,它不会被缩放,但是当用户拖动视图或缩放它时,它应该保持在放置的坐标上。所以它应该像在谷歌地图上一样工作:大图像作为背景和选择器,用户可以将其放置在任何地方。我尝试使用 PhotoView 在此处输入链接描述,因为它支持缩放、拖动。但我无法在此配置中创建它。我试图将选择器限制为从左、右、上、下进行照片查看。Bu PhotoView 修改其中的图像,当我缩放或拖动它时,我的选择器“飞”到屏幕外。然后我尝试将选择器与 PhotoView 中的图像合并,但这种方式不太合适,因为当用户缩放图像时,选择器会随之缩放(它是图像的一部分)。

那么,也许有人会做这样的事情?

我的解决方案:

var lastX = -1F
var lastY = -1F
photoview.setOnPhotoTapListener { _, x, y ->
    lastX = (x * originalImage.width) - picker.width / 2
    lastY = (y * originalImage.height) - picker.height
    photoview.setImageBitmap(originalImage.mergeWith(picker, lastX, lastY))
}
photoview.setOnScaleChangeListener { _, _, _ ->
    if (lastX != -1F && lastY != -1F) {
        photoview.setImageBitmap(originalImage.mergeWith(picker, lastX, lastY))
    }
}

合并图像和选择器的功能:

fun Bitmap.mergeWith(bp: Bitmap, x: Float, y: Float): Bitmap {
    val result = createBitmap(
        if (width > bp.width) width else bp.width,
        if (height > bp.height) height else bp.height,
        config
    )
    val canvas = Canvas(result)
    canvas.drawBitmap(this, 0F, 0F, null)
    canvas.drawBitmap(bp, x, y, null)
    return result
}
4

0 回答 0