繁体   English   中英

Android Canvas Rect.contains(x, y) 仅针对左上矩形触发

[英]Android Canvas Rect.contains(x, y) only firing for top left Rect

我在Canvas中有一个像素网格(矩形),如下所示:

在此处输入图像描述

代码:

class MyCanvasView(context: Context) : View(context) {
    private lateinit var extraCanvas: Canvas
    private lateinit var extraBitmap: Bitmap

    private val spanCount = 10.0

    private val rectangles = mutableListOf<RectF>()

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)

        if (::extraBitmap.isInitialized) extraBitmap.recycle()

        extraBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
        extraCanvas = Canvas(extraBitmap)

        val scale = (w / spanCount)

        for (i in 0..spanCount.toInt()) {
            for (i_2 in 0..spanCount.toInt()) {
                val rect = RectF(
                    ((i * scale).toFloat()),
                    ((i_2 * scale).toFloat()),
                    scale.toFloat(),
                    scale.toFloat()
                )
                Log.d("MY_LOG", "LEFT: ${((i * scale).toFloat())} TOP: ${((i_2 * scale).toFloat())} ")

                rectangles.add(rect)
                extraCanvas.drawRect(
                    rect,
                    Paint().apply {
                        style = Paint.Style.FILL
                        color = Color.WHITE
                    })
            }
        }

        for (i in 0..spanCount.toInt()) {
            for (i_2 in 0..spanCount.toInt()) {
                extraCanvas.drawRect(
                    (i * scale).toFloat(),
                    (i_2 * scale).toFloat(),
                    scale.toFloat(),
                    scale.toFloat(),
                    Paint().apply {
                        color = Color.GRAY
                        style = Paint.Style.STROKE
                    })
            }
        }

    }

    override fun dispatchTouchEvent(event: MotionEvent): Boolean {
        val x = event.rawX
        val y = event.rawY

        when (event.actionMasked) {
            MotionEvent.ACTION_DOWN -> {
                for (rect in rectangles) {
                    if (rect.contains(x, y)) {
                        Toast.makeText(context, "Touched", Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }

        return true
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        canvas.drawBitmap(extraBitmap, 0f, 0f, null)
    }
}

出于某种原因, dispatchTouchEvent仅在此处为左上角的矩形触发:

在此处输入图像描述

...但不是其他的。

如果有人知道为什么会这样,请告诉我,我是所有这些 Canvas 东西的新手,所以我知道我的代码可能有问题。

我相信因为你的底部和右侧坐标总是相同的:

val left = (i * scale).toFloat()
val top = (i_2 * scale).toFloat()
val rect = RectF(
    left, 
    top,
    left + scale.toFloat(),
    top + scale.toFloat()
    )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM