Игра поиска слов: как выбрать несколько элементов в GridView путем перетаскивания? (Android)

ЗДЕСЬ – ДЕТАЛИ ПРОГРАММЫ: Итак, я создаю игру поиска слов, например, где есть куча букв, расположенных на квадрате, и вам нужно найти и выбрать слова, которые либо вертикально, горизонтально, либо по диагонали. Я использую массив строк для платы и использую ArrayAdapter для хранения этого массива строк в gridview, который является базовым элементом макета моего основного действия.

ЗДЕСЬ ВОПРОС: Как я могу сделать так, чтобы пользователи могли перетаскивать свой палец по их выбору, выбирая все буквы в слове, не отрывая пальца от экрана несколько раз? И я хочу, чтобы подсветка над выбранным словом оставалась на экране, а игрок выбрал слово, и я хочу, чтобы подсветка над буквами исчезла, когда пользователь поднял палец с экрана, если он неправильно выбрал слово ,

    Я опаздываю на этот вопрос, но в последнее время сталкиваясь с подобной проблемой, я решил создать свою собственную библиотеку видных плат для решения этой проблемы. Это добавляет больше гибкости в то, что вы можете сделать, и это приводит к более простой реализации.

    Вот некоторые фрагменты кода, показывающие, как это работает. Во-первых, легко нарисовать сетку платы по методу onDraw() пользовательского вида:

     @Override protected void onDraw(Canvas canvas) { for (int i = 0; i <= numRows; i++) { //For custom grid sizes, y can't be equal the board size or the line drawn won't show int y = Math.min(boardHeight - 1, i * tileSize); canvas.drawLine(0, y, boardWidth, y, boardPaint); } for (int i = 0; i <= numCols; i++) { //For custom grid sizes, x can't be equal the board size or the line drawn won't show int x = Math.min(boardWidth - 1, i * tileSize); canvas.drawLine(x, 0, x, boardHeight, boardPaint); } } 

    Если у вас есть массив строк String[][] , вот как вы могли бы установить буквы, предполагая, что представления для каждой плитки уже размещены на доске:

     public void setLetterBoard(String[][] letterBoard) { if (letterBoard.length != getNumRows() || letterBoard[0].length != getNumCols()) { setBoardSize(letterBoard.length, letterBoard[0].length); } int row, col; for (int i=0; i < getChildCount(); i++) { row = i / getNumCols(); col = i % getNumCols(); LetterTileView child = (LetterTileView) getChildAt(i); child.setLetter(letterBoard[row][col]); } } 

    Затем вам нужна более сложная работа, чтобы на самом деле справиться с прикосновением и перетащить плитки плиты, чтобы выбрать слова:

     @Override public boolean onTouchEvent(MotionEvent event) { float X = event.getX(); float Y = event.getY(); int row = (int) (Y / getTileSize()); int col = (int) (X / getTileSize()); View child = getChildAt(row, col); //Exit on invalid touches if (event.getActionMasked() != MotionEvent.ACTION_UP && (row >= getNumRows() || col >= getNumCols() || child == null)) { return true; } switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: Tile currentTile = new Tile(row, col, child); if (currentSelectedWord == null) { currentSelectedWord = new SelectedWord(currentTile); } else if (!currentTile.equals(currentSelectedWord.lastTile) && currentSelectedWord.isTileValid(currentTile)) { if (!currentSelectedWord.isTileAllowed(currentTile)) { //Clear the status of the old selection updateTiles(currentSelectedWord.selectedTiles, false, false); //If the current tile is valid but not allowed for the current word selection, //start a new selection that matches the tile currentSelectedWord = new SelectedWord(currentSelectedWord.getInitialTile()); } List<Tile> tiles = getTilesBetween(currentSelectedWord.lastTile, currentTile); if (tiles.size() > 0) { currentSelectedWord.addTiles(tiles); } } updateTiles(currentSelectedWord.selectedTiles, true, false); break; case MotionEvent.ACTION_UP: if (currentSelectedWord != null) { boolean isValidSelection = (listener != null && listener.onWordSelected(currentSelectedWord.toBoardWord())); updateTiles(currentSelectedWord.selectedTiles, false, isValidSelection); if (isValidSelection) { selectedWords.add(currentSelectedWord); } currentSelectedWord = null; } break; default: return false; } return true; } 

    Методы isTileValid() и isTileAllowed() убедитесь, что пользовательский фрагмент, который пользователь пытается выбрать, находится в разрешенном направлении и ранее не был выбран. Наконец, getTilesBetween() возвращает все допустимые фрагменты между первым фрагментом, который коснулся пользователь, и тем, с которым он в данный момент касается.

    Надеюсь, поможет!

    Intereting Posts
    Запись видео в приложении Android при выключении экрана Рассчитать фактическое расстояние, пройденное мобильным HTC One M8 работает на Android Studio Не удается получить файл с помощью asmack и xmpp Тестирование шоу с закусками с эспрессо Создание 3D-анимации для Android-приложений Обнаружение восстановления сети 3G или Wi-Fi Уведомление о толчке Firebase не работает Скрыть панель инструментов с помощью CoordinatorLayout, но RecyclerView на фрагменте OnItemClick дает индекс / позицию элемента на видимой странице … не фактический индекс элемента в списке ..issue при включении setTextFilterEnabled Как сделать кнопку, чтобы заполнить 50% от ширины экрана в android? Автоматически создавать / редактировать манифест андроида Событие LongClick также вызывает событие Click Удалить полосу прокрутки с помощью навигационного ящика для поддержки Android? Java Jackson org.codehaus.jackson.map.exc.UnrecognizedPropertyException