Скользящее изображение 4x4 с GridLayout - PullRequest
0 голосов
/ 21 июня 2019

Я хочу спросить о головоломке со скользящим изображением. ниже код для слайда влево или вправо. но у меня есть проблема.

  if (i + 1 < imageviews.size) {
                if (imageviews[i + 1]!!.drawable == null) {
                    mGridLayout.removeView(imageviews[i + 1])
                    mGridLayout.addView(imageviews[i + 1], i)
                    val temp = imageviews[i + 1]
                    imageviews[i + 1] = imageviews[i]
                    imageviews[i] = temp
                }
            }
            if (i - 1 >= 0) {
                if (imageviews[i - 1]!!.drawable == null) {
                    mGridLayout.removeView(imageviews[i - 1])
                    mGridLayout.addView(imageviews[i - 1], i)
                    val temp = imageviews[i - 1]
                    imageviews[i - 1] = imageviews[i]
                    imageviews[i] = temp
                }
            }

прежде чем делать что-либо: image1 enter image description here

1 Ответ

1 голос
/ 21 июня 2019

Я обновил функцию setOnClickListener(), и она, кажется, работает, но я не решил ее полностью:

private fun setOnClickListener() {
    Log.i(TAG, "${imageviews.size} ")
    for (i in 0 until imageviews.size step 1) {
        imageviews[i]!!.setOnClickListener {
            Log.i(TAG, "${imageviews.size} $i")

            val top: Int? = if (i - GRID_NO >= 0) i - GRID_NO else null
            val bottom: Int? = if (i + GRID_NO < imageviews.size) i + GRID_NO else null
            val left: Int? = if (i % GRID_NO > 0) i - 1 else null
            val right: Int? = if (i % GRID_NO < GRID_NO - 1) i + 1 else null

            // Log.i(TAG, "Top: $top Bottom: $bottom Left: $left Right: $right")

            if (top != null && imageviews[top]!!.drawable == null) {
                imageviews[top]!!.setImageDrawable(imageviews[i]!!.drawable)
                mGridLayout.removeViewAt(i)
                mGridLayout.addView(imageviews[i], i)
                imageviews[i]!!.setImageDrawable(null)
            } else if (bottom != null && imageviews[bottom]!!.drawable == null) {
                imageviews[bottom]!!.setImageDrawable(imageviews[i]!!.drawable)
                mGridLayout.removeViewAt(i)
                mGridLayout.addView(imageviews[i], i)
                imageviews[i]!!.setImageDrawable(null)
            } else if (left != null && imageviews[left]!!.drawable == null) {
                imageviews[left]!!.setImageDrawable(imageviews[i]!!.drawable)
                mGridLayout.removeViewAt(i)
                mGridLayout.addView(imageviews[i], i)
                imageviews[i]!!.setImageDrawable(null)
            } else if (right != null && imageviews[right]!!.drawable == null) {
                imageviews[right]!!.setImageDrawable(imageviews[i]!!.drawable)
                mGridLayout.removeViewAt(i)
                mGridLayout.addView(imageviews[i], i)
                imageviews[i]!!.setImageDrawable(null)
            }
            if (isSolved()) {
                Toast.makeText(this, "Success , true", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

ОБНОВЛЕНО isSolved () ФУНКЦИЯ ПО ЗАПРОСУ

Обновлено isSolved() выглядит следующим образом:

private fun isSolved(): Boolean {
    var solved = true
    for (i in 0 until GRID_NO) {
        for (j in 0 until GRID_NO) {
            val index: Int = i * GRID_NO + j
            if (imageviews[index]!!.drawable == null) {
                continue
            } else if (imageviews[index]!!.drawable != imageViews[i][j]!!.drawable) {
                solved = false
                break
            }
        }
    }
    return solved
}

Обратите внимание, что эта версия возвращает true, если все ячейки, кроме пустой, находятся в правильном месте, то есть пустая ячейка может быть любой ячейкой в ​​конце,Если головоломки такого типа обычно имеют более ограниченные правила успеха, например, пустая ячейка должна быть по углам, ее необходимо обновить.

...