Собери котов в Android 7 Nougat (не только)

от автора

Ярые фанаты Android знают, что в системе прячутся пасхалки. Не стала исключением и седьмая версия под названием Nougat. В ней можно активировать игру по сбору котов. Вам нужно изредка класть в пустую миску угощение и ловить пришедшего кота.
Сам процесс активации пасхалки подробно описан в блоге. Здесь же я расскажу, что находится под капотом.

В игре коты появляются с трехзначными числами. Теоретически котов может быть 1000 штук от 000 до 999 (на самом деле нет, в программе используется другой алгоритм, но для нас это не принципиально).
Мне стало интересно, как они хранятся в приложении. Поиск в интернете привел меня на ресурс, где выложены исходники пасхального яйца Easter Egg.
Позже на Гитхабе я нашел модифицированный код, который позволяет запускать игру как обычное приложение на любом устройстве, а не только на Android 7 — https://github.com/Abhinav1997/NekoCollector. Собранную версию из этих исходников можно найти Google Play по ключевым словам Neko Collector.
Второй пример удобнее изучать, так как там нет лишнего кода для активации пасхалки, который нам ни к чему.
Было не трудно догадаться, что основная магия происходит в классе Cat.

Усы, лапы, хвост — вот мои документы

Оказалось, что коты не хранятся в приложении в виде отдельных картинок. Вполне объяснимо, большое количество изображений раздует программу. В папке drawable в виде векторных ресурсов хранятся отдельные части кота. Например, так хранится хвост в файле tail.xml.

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

        CatParts(Context context) {             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {                 body = context.getDrawable(R.drawable.body);                 head = context.getDrawable(R.drawable.head);                 leg1 = context.getDrawable(R.drawable.leg1);                 leg2 = context.getDrawable(R.drawable.leg2);                 leg3 = context.getDrawable(R.drawable.leg3);                 leg4 = context.getDrawable(R.drawable.leg4);                 tail = context.getDrawable(R.drawable.tail);                 leftEar = context.getDrawable(R.drawable.left_ear);                 rightEar = context.getDrawable(R.drawable.right_ear);                 rightEarInside = context.getDrawable(R.drawable.right_ear_inside);                 leftEarInside = context.getDrawable(R.drawable.left_ear_inside);                 faceSpot = context.getDrawable(R.drawable.face_spot);                 cap = context.getDrawable(R.drawable.cap);                 mouth = context.getDrawable(R.drawable.mouth);                 foot4 = context.getDrawable(R.drawable.foot4);                 foot3 = context.getDrawable(R.drawable.foot3);                 foot1 = context.getDrawable(R.drawable.foot1);                 foot2 = context.getDrawable(R.drawable.foot2);                 leg2Shadow = context.getDrawable(R.drawable.leg2_shadow);                 tailShadow = context.getDrawable(R.drawable.tail_shadow);                 tailCap = context.getDrawable(R.drawable.tail_cap);                 belly = context.getDrawable(R.drawable.belly);                 back = context.getDrawable(R.drawable.back);                 rightEye = context.getDrawable(R.drawable.right_eye);                 leftEye = context.getDrawable(R.drawable.left_eye);                 nose = context.getDrawable(R.drawable.nose);                 collar = context.getDrawable(R.drawable.collar);                 bowtie = context.getDrawable(R.drawable.bowtie);             } else {                 // здесь код для старых версий             }             drawingOrder = getDrawingOrder();         } 

Так как вектор обладает замечательной возможностью менять заливку на лету, то в случайном порядке выбираем цвета и генерируем уникального кота. Главное — не переборщить. Не стоит красить одну лапу в чёрный, а вторую лапу в коричневый цвет.

Если запускать программу в обычном режиме, то коллекционирование котиков растянется на долгие часы. Поэтому подменяем код, который отвечает за интервал, установив его в 1 секунду. Быстро заполняем экран.

Определённо стоит покопаться в коде приложение и изучить другие методы. Например, когда вы хотите поделиться пойманным котом в социальных сетях, то генерируется отдельное изображение PNG размером 512х512 хорошего разрешения на устройствах не ниже Android 6.0 Marshmallow. На старых устройствах изображение формируется через другой метод, и картинки получаются смазанными.
Для сравнения первая картинка, которую я получил на эмуляторе Android 7.

А это картинка, полученная на устройстве Android 4.4.2

Тем, кто изучает программирование под Android, пригодятся приёмы запуска служб с регистрацией планировщика JobSheduler, создание диалогов, использование SharedPreferences.

На мой взгляд, пасхалка получилась красивая и подняла мне настроение.
Собирайте котиков!
ссылка на оригинал статьи https://habrahabr.ru/post/313788/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *