Вместо этого я отправил другой ответ, потому что после разъяснения проблема определенно отличается от того, во что я изначально верил. Тем не менее, приемы, описанные в предыдущем ответе, не следует забывать, и они являются отличным ресурсом для решения других связанных с этим вопросов, поэтому я храню их там.
Проблема:
GridView теперь рисует (вроде), но повторяет одни и те же изображения снова и снова, что приводит к ужасным артефактам. Получающиеся в результате артефакты настолько плохи, что на самом деле не дают хорошего указания относительно того, присутствуют ли другие виды. Эта проблема на самом деле вызвана проблемой "слишком большой прозрачности".
Android и прозрачность
Android прекрасно справляется с прозрачностью обработки, позволяя объектам ниже отображать текущий вид, пока фокус top находится в фокусе. Однако, если все представления прозрачны, Android ничего не сможет отследить, когда ему нужно будет обновить. Обычно это не проблема.
Как правило, разработчики используют предоставленные нам инструменты и просто стараются сделать с ними что-то интересное. (YAY!) И пока мы их используем, Android говорит (в значительной степени): «Я знаю, что делать!» Однако, когда мы начинаем с пользовательских видов, Android может немного испугаться, особенно когда дело доходит до рисования соответствующим образом.
Ваш GridView на самом деле не GridView
. Это расширенный GridView
. Как расширение представления Android, Android не делает никаких предположений о том, как его следует рисовать, оооочень .... В результате нормального непрозрачного фона для вашего GridView не существует. Можно подумать, «но у меня есть это в RelativeLayout
. Разве этого не достаточно?» Ответ - нет. Объекты макета являются объектами макета. У них нет фона, если мы не укажем их.
Это усугубляется, когда вы выполняете прокрутку и другие подобные движения или анимацию. В этих случаях Android пытается кешировать. Кэширование происходит как бы ниже всех просмотров, но в результате получается, что, поскольку все прозрачно, вы видите весь процесс. И он не сбрасывается, пока не потребуется очистить кеш. Вот почему становится все хуже и хуже.
Другими словами, «окно» может выглядеть черным, но на самом деле не черным ...
Решение (часть I):
Таким образом, ответ заключается в том, чтобы установить непрозрачный фон либо в расширенный GridView
, либо в один из его родительских видов. Это должно устранить артефакты, которые вы видите при прокрутке. И это должно позволить вам правильно увидеть, как и если другие виды рендеринга. В конечном счете, вы хотите попробовать применить фон к верхнему представлению, которое охватывает все представления. Задать фон можно так же просто, как установить цвет фона (так как он создает непрозрачный рисунок).
Следующие шаги:
Я заметил, что вы пропустили соответствующий код. Мне действительно нужно знать, что за Adapter
ваш TileAdapter
расширяет и как он получает свою базовую информацию. Это может повлиять на то, как оно получает и присваивает события розыгрыша. Как только мы узнаем это, мы сможем исправить все остальное.
Мне также нужно знать, как вы позиционируете тайлы (код позиционирования отсутствует). Поскольку код позиционирования отсутствует, нет способа узнать, действительно ли добавляются представления. Поведение по умолчанию для ImageViews состоит в том, что если хотя бы некоторая их часть не видна, они не добавляются в иерархию до тех пор, пока они не будут видны. Мы хотим вызвать эту проблему
Конечный результат может все еще потребовать корректировки макета, мер или рисунков, но мы не узнаем, пока не получим точное представление о том, что происходит.
Альтернативный результат
Что-то, я бы хотел, чтобы с играми с прокруткой чаще случалось, если бы они запустили с уменьшенной позицией, и мы могли бы "переместиться" в увеличенную позицию. Это может легко разрешить ваш ChildCount, так как вы сказали, что если он аккуратно умещается на экране, они все рисуют. И первоначальное увеличение может произойти после того, как все будет загружено. Тогда у вас есть хороший графический эффект, указывающий, что загрузка завершена. Уменьшение - это обычная анимация, которую легко реализовать. и вы знаете, что все ваши дети загружены. Кроме того, это может ограничить код, который вы должны ввести, чтобы заставить его работать правильно. Наконец, все это можно сделать с помощью одного и того же объекта GameGrid. :)
Я не знаю, думали ли вы об этом, но я подумал: «Эй, похоже, это простой способ убить более двух птиц одним камнем».