Как сделать прокручиваемую матрицу в Android?

1

Я пытаюсь создать простое приложение, которое покажет двумерную прокручиваемую матрицу квадратных плит. Представьте себе 2D Rubick Cube, где вы можете выбрать прокрутку одной строки или одного столбца, как если бы это было кольцо.

Я разместил RelativeLayout внутри основного представления и поместил все фрагменты матрицы внутри него через пользовательскую реализацию компонента ImageView. Я установил точное положение одиночной плитки, манипулирующей ее значением RelativeLayout.LayoutParams:

RelativeLayout rl = ...;
TileView tile = ...;
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(size, size);
rlp.setMargins(left, top, 0, 0);
rl.addView(tile, rlp);

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

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

  1. Когда я прокручиваю строку вправо, последняя плитка на правом краю будет постепенно уменьшаться, как если бы она пыталась заполнить оставшееся пространство и в конечном итоге исчезнет.
  2. Когда я прокручу назад влево, исчезающие плитки не появятся снова.

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

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

Спасибо!

Теги:
relativelayout
android-layout

1 ответ

1
Лучший ответ

Если бы я делал это, моя склонность заключалась в том, чтобы идти на него на более низком уровне, чем вы. Я бы использовал SurfaceView в качестве основного представления и отображал плитки с помощью Canvas.drawBitmap(). Вероятно, это похоже на работу, но я думаю, что это правильный способ сделать то, что вы пытаетесь сделать, и что в конечном итоге вы будете более счастливы с результатами.

Чтобы решить две проблемы:

  1. Версия drawBitmap() я связан, позволяет вам указать подмножество Bitmap для рисования, чтобы вы могли скопировать фрагмент, а не уменьшать его, когда он отключается от экрана.
  2. Вы будете нести ответственность за определение того, что происходит там (и нарисовать его там), поэтому ваша структура данных, представляющая матрицу плитки, должна также представлять собой экраны вне экрана.
  • 0
    Я решил использовать разные представления для каждого, чтобы иметь лучший способ обрабатывать события касания и прокрутки в строках / столбцах. Если я вместо этого использую один SurfaceView , как мне обрабатывать эти события? В таком случае у меня был бы один большой вид, и я должен использовать координаты, чтобы найти плитку, к которой я прикасаюсь?
  • 0
    Да, как я уже сказал, это более низкий уровень - так что вам придется немного подсчитать, чтобы преобразовать координаты касания в координаты строки / столбца мозаики, и перейти оттуда. Существует определенный порог уникальности в том, что вы делаете, в какой момент падение на более низкий уровень делает вещи проще, даже если такие мелочи, как выяснение того, к какому плитку прикоснуться, становятся немного сложнее. Я бы сказал, что то, что вы делаете, звучит как игра, и большинство игр делают то, что я предлагаю.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню