如何在用户单击的图像视图中标记位置

How to mark a positions in an imageview where the has user clicked

我的 android 应用程序中有一个图像视图:

  <ImageView
                        android:layout_width="250dp"
                        android:layout_height="250dp"
                        android:id="@+id/imageviewMap"
                />

还有一个 onTouchlistener 来获取用户点击的位置

imageviewMap.setOnTouchListener(object : View.OnTouchListener {
        override fun onTouch(v: View?, event: MotionEvent?): Boolean {
            event?.let { e ->
               drawCross(e.x,e.y)
            }
            return true
        }
    })

需要的是在用户点击的位置(或上方)画一个十字。 (多次)

如何实现drawCross方法?

这是我的解决方案。感谢 Kabir 的有用提示。

我使用了两个图像视图,一个用于背景,一个透明的用于标记

                    <ImageView
                        android:layout_width="250dp"
                        android:layout_height="250dp"
                        android:id="@+id/imageviewMap"
                        android:src="@drawable/map"
                />
                <ImageView
                        android:layout_width="250dp"
                        android:layout_height="250dp"
                        android:id="@+id/imageviewCrosses"
                />

触摸监听器

       imageviewMap.setOnTouchListener { view, event ->
        event?.let { e ->

            if(event.action == MotionEvent.ACTION_UP) {
                val x = convertPixelsToDp(e.x, this.applicationContext)
                val y = convertPixelsToDp(e.y, this.applicationContext)
                drawCross(x,y)
            }
        }
        true
    }

像素dp转换方法

fun convertPixelsToDp(px: Float, context: Context): Float{
    return px /  (context.resources.displayMetrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT.toFloat())
}

fun convertDpToPixels(dp: Float, context: Context): Float {
    return dp * (context.resources.displayMetrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT.toFloat())
}

drawCross方法(测试时画了一个圆)

fun drawCross(x: Float, y: Float) {
    val bitmap = Bitmap.createBitmap(
        250, 
        250,
        Bitmap.Config.ALPHA_8
    )

    val canvas = Canvas(bitmap)
    canvas.drawColor(Color.TRANSPARENT)


    val paint = Paint()
    paint.color = Color.RED
    paint.style = Paint.Style.STROKE
    paint.strokeWidth = 1.0f
    paint.isAntiAlias = true

    canvas.drawCircle(
        x, 
        y, 
        10.0f,
        paint 
    )

    imageviewCrosses.setImageBitmap(bitmap)
}