Проблема с onClickListener в Android Studio

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

То, что я пытался сделать, это использовать макет сетки из 9 изображений для плиток. Всякий раз, когда необходимо переместить плитку, я создаю десятый просмотр изображения, передавая ему источник изображения и местоположение этой плитки. Исходный тайл затем устанавливается на невидимый, и тайл движущегося перемещается в новое место, после чего он передает эти данные в получающий тайл и становится невидимым.

Сначала я нахожу смещение между двумя соседними изображениями:

    int startPosition1[] = new int[2];
    topLeft.getLocationOnScreen(startPosition1);
    int startPosition2[] = new int[2];
    topCenter.getLocationOnScreen(startPosition2);

    final int separation = startPosition2[1] - startPosition1[1];

Затем в OnClickListener я проверяю, допустимо ли перемещение, и вызываю метод, который я создал, чтобы выполнить перемещение (moveme):

    topLeft.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int thisLocation[] = new int[2];
            v.getLocationOnScreen(thisLocation);

            int invisibleLocation[] = new int[2];
            findViewById(theInvisible).getLocationOnScreen(invisibleLocation);

            if ((thisLocation[0] - invisibleLocation[0]) == 0)
            {
                if ((thisLocation[1] - invisibleLocation[1]) == separation)
                {
                    Toast.makeText(getApplicationContext(), R.string.boldly ,Toast.LENGTH_LONG).show();
                    moveMe(thisLocation, "translationY", (0-separation), v);

                }
                else if((invisibleLocation[1] - thisLocation[1]) == separation)
                {
                    Toast.makeText(getApplicationContext(), R.string.boldly, Toast.LENGTH_LONG).show();
                    moveMe(thisLocation, "translationY", separation, v);

                }
            }
            else if ((thisLocation[1] - invisibleLocation[1]) == 0) {
                if ((thisLocation[0] - invisibleLocation[0]) == separation) {
                    Toast.makeText(getApplicationContext(), R.string.boldly, Toast.LENGTH_LONG).show();
                    moveMe(thisLocation, "translationX", (0 - separation), v);


                } else if ((invisibleLocation[0] - thisLocation[0]) == separation) {
                    Toast.makeText(getApplicationContext(), R.string.boldly, Toast.LENGTH_LONG).show();
                    moveMe(thisLocation, "translationX", separation, v);

                }
            }
            else
            {
                Toast.makeText(getApplicationContext(), R.string.illogical, Toast.LENGTH_LONG).show();
            }

        }
    });

Вот метод moveMe:

    void moveMe( int[] thisLocation, String direction, int separation, View v)
{
    Log.i(TAG, "Entere mover");
    ImageView mover = (ImageView) findViewById(R.id.mover);
    ImageView destination = (ImageView) findViewById(getTheInvisible());
    mover.setContentDescription(v.getContentDescription());
    setView(mover);

    mover.setX(thisLocation[0]);
    mover.setY(thisLocation[1]);
    Log.i(TAG, "relocated mover");

    mover.setVisibility(View.VISIBLE);
    v.setVisibility(View.INVISIBLE);
    v.setClickable(false);
    setTheInvisible(v);
    Log.i(TAG, "Swapped visibilities");

    ObjectAnimator test = ObjectAnimator.ofFloat(mover, direction, separation);
    test.setDuration(1000);
    test.setRepeatCount(0);
    test.start();
    Log.i(TAG, "animation complete");

    destination.setContentDescription(mover.getContentDescription());
    setView(destination);
    destination.setVisibility(View.VISIBLE);
    destination.setClickable(true);
    mover.setVisibility(View.INVISIBLE);
    Log.i(TAG, "Swapped views with destination");
}

Насколько я могу судить, этот метод даже не вызывается. Кроме того, любой тайл, который соответствует критериям для вызова этого метода, также не выдает своего всплывающего сообщения. Наконец, я заметил, что любая плитка, расположенная на расстоянии двух пробелов непосредственно вдоль оси x или y от пустой плитки, также не отображает ее текст. Заранее спасибо.

1 ответ

Решение

Хорошо, после почти недели поиска я нашел проблему. Как оказалось, GridLayouts предоставляет свои собственные анимации. Чтобы включить их, все, что вам нужно сделать, это поместить в элемент GridLayout в xml:

android:animateLayoutChanges="true"

Затем просто внесите изменения и вызовите layoutAnimator следующим образом:

mover.setLayoutParams(destination.getLayoutParams());
theGrid.startLayoutAnimation();

В этом примере движущий объект - это ImageView, который временно принимает изображения других видов и перемещает их в другие координаты сетки. theGrid - это имя идентификатора ресурса, которое я дал в виде сетки.

Проблема с тем, что он ничего не делал для определенных плиток, была ошибкой в ​​моих утверждениях if then.

Другие вопросы по тегам