Проблема с 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.