Android: добавить маркер на ImageView - PullRequest
1 голос
/ 26 марта 2019

Я пытался создать вид с изображением (план этажа) и маркером на нем. Мне нужно добавить маркер на место, где пользователь нажал. Этот маркер должен быть другим видом, который не масштабируется, когда пользователь масштабирует ImageView, но должен оставаться в размещенных координатах, когда пользователь перетаскивает вид или масштабирует его. Так что он должен работать как на Google Maps: большое изображение в качестве фона и средство выбора, которое пользователь может разместить где угодно. Я пытался использовать PhotoView , введите здесь описание ссылки , потому что он поддерживает масштабирование, перетаскивание. Но я не смог создать его в этой конфигурации. Я пытался убедить сборщика к просмотру фотографии слева, справа, сверху, снизу. Но 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
}
...