Решил попробовать сделать приложение для мобильных устройств, используя многострадальный Delphi, переделав одну из своих программ для ПК. Получилось как-то так:
Проверял на нескольких устройствах, для древних Андроидов (четыре и ниже) не подойдет скорее всего. Я просто не нашел настолько старый рабочий SDK.
Что могу сказать от себя - делать мобильные приложения тот еще геморой. Эта простая игра из меня все соки выпила. Было не очень интересно, скорее даже напряжно. Чтобы портировать простой код пришлось решить кучу вспомогательных технических задач. Даже не ожидал, что будет так сложно. Наверно, если бы был программистом, то было бы легче, но имеем то, что имеем.
Давно хотел написать простую игрушку на телефон для себя, да и так, чтоб можно было друзьям показать, потыкать. В мобильной разработке довольно давно, так что как делать хорошо понимаю, а вот что делать… С этим всегда проблемы. Обычно работает так: есть люди, которые говорят: «Давай сделаем так для того, чтобы что-то». Потом приходят дизайнеры и говорят: «Выглядеть оно должно вот так». Ты садишься и делаешь. Довольно часто в голове проскакивают мысли из разряда:
А почему мне не сделать свое приложение?
Зачем мне все эти промежуточные звенья?
Хочу сам решать как и что
И вот тогда, полный энергии и запала ты садишься и… И все. Упираешься в то, что у тебя нет идей. Появилась идея? Тогда ты понимаешь, что дизайнер из тебя никакой. Приходит осознание, что наверно, все эти люди есть не просто так. Возвращаешься на работу и делаешь чужой проект дальше, и так по кругу.
Несколько дней назад я ложился спать и подумал, что слишком часто в последнее время вижу, что знакомые играют в игры по типу «отгадай что за слово за N попыток», как у желтого банка была игра «5 букв» или что-то такое. И тут я понял, что сделать ее - не стоит ничего. Тут же взял ноутбук и начал.
План написания приложения был примерно следующий:
Найти в открытом доступе файл с существительными на английском языке, из которого, собственно и будут браться слова
Написать свою клавиатуру - главный по сложности виджет в этом приложении
Написать форму для ввода слов
Добавить элемент монетизации (конечно, куда же без этого)
Выложить в открытый доступ
Итак, поехали. 1 этап прошел довольно быстро и безболезненно, но со своими приколами. Я нашел список слов, состоящий примерно из 1800 существительных, но как оказалось позже, в нем очень много пробелов и довольно часто нет очевидных слов. Но и ладно, для старта подойдет.
Идем дальше. Чтобы написать клавиатуру, надо понять, в каком состоянии могут быть буквы. В целом, достаточно посмотреть пару примеров и Делаем вывод, что состояния может быть 3:
Эту букву мы еще не пробовали
Пробовали, но в загаданном слове такой нет
Пробовали и да, такая буква есть
Выбираем цветовую палитру. Мне лично, очень нравится, как выглядят салатный и оранжевый на сером фоне. Так давайте так с сделаем. С ними еще и голубой будет норм смотреться. Для клавиатуры основным цветом выбираем салатовый. Главной кнопкой аля SPACE сделаем проверку введенного слова. Если букву не угадываем - убираем обводку, если угадываем - добавляем цвета в фон. Получается что-то такое, вроде даже смотрится.
Клавиатура
Поехали дальше. Форма для ввода слов. Тоже долго не думаем, каждая буква в отдельной ячейке, при проверке слова сначала проверим, что все буквы введены, затем проверим, что введенное слово есть в нашем словаре, ну и наконец, по одной букве сравним то, что ввел пользователь с нашим загаданным (взятым рандомно из списка) словом. По состоянию, каждая ячейка для буквы может быть в одном из следующих состояний:
Еще не проверяли
Такой буквы нет в слове
Буква есть, но она не на своем месте
Да, ты угадал! Ровно эта буква и ровно здесь!
По цветам, в целом, возьмем все те же, но добавим еще немного серого для букв, которые нам не подходят. Смотрите, получается что-то такое:
О, это конец?
Казалось бы, готовая игра. Но нет, давайте добавим немного информации для пользователя, не всем же очевидно, что эти цвета вообще значат. В процессе написания, кстати, название просто всплыло в голове и начальный вариант я оставил без изменений: "Worder World". Как вам? Типа Wonder - WORDer, ну вы поняли. Отвлеклись, итак, добавляем кнопку инфо и немного разъяснений в виде попапа. Получается так:
Немного понятней стало
Так, а в чем моя игрушка будет отличаться от большинства других? У меня есть словарь, но правда ли я буду использовать в нем только 5-и буквенные слова? А зачем? Давайте добавим возможность пользователю самому выбирать какой длины слово он хочет. Добавляем стартовый экран с выбором длины. От 5 до 8 как будто должно хватить. А вот и идеальное место, где можно получить профит. 5, 6 - бесплатно, хочешь сложнее - плати)) Почему бы и нет, да и все равно игрушка моя, хочу так и все тут.
Выбираем сложность
Получается вот так. Вкладка магазина возможно получит жизнь в будущем, если есть идеи что туда добавить - пишите.
Финальный штрих - добавим стартовый экран загрузки с простой анимацией и немного рекламы (Правда совсем чуть чуть, да и почему нет, все равно с нее заработок измеряется в десятых частях центов). Сделаем попапы о выигрыше или проигрыше да и в целом все, игра готова.
Ну что ж, пошли выкладываться в стор. Аккаунт разраба есть, название есть, описание накатаем, скриншот наделаем, формочки необходимые заполним, отправляемся на модерацию. Что по времени? Прошло часа 3, а внутренний владелец собственной игрушки рад) Всем спасибо, если вдруг захотите посмотреть - вот ссылочка https://play.google.com/store/apps/details?id=com.agamatech...., если находите слова, которых нет в моем не очень большом словаре, или вы придумали, что крутого можно туда добавить - пишите, сделаем!
Добрый вечер всем. Или не вечер- у кого что... Когда то я уже писал, что по утрам подрабатываю сборщиком заказов (грузчик, водитель и что попросят) и решил написать себе в помощь программу. Далеко не программист, совсем далеко, но первая версия появилась на свет в года полтора назад.
Написана программа на Visual Basic (Microsoft Visual Studio 2008), так как на руках был простенький сканер сбора данных (Motorolla, модель не помню, но попозже, как буду дома- выложу фото). Не было сенсорного экрана и навигация осуществлялась кнопками. Сурово и просто. Тогда эта программка неплохо помогла мне (даже на основной работе). Чуть позже появлялись другие ТСД (на андроиде, фирмы Urovo), но что то мне в итоге не понравилось (да и цена за терминал этой фирмочки был не мал) или не получилось и я продал их, оставив один с неисправным тачем. Так я начал переписывать код для Андроид терминалов (да и простого телефона, если к нему подключить беспроводной сканер или проводной- как угодно). Знаний тогда у меня было не многим больше, чем сейчас. Изучать всякие java и Kotlin не смог- глуповат и ленив, а потому выбор пал на блочное программирование, почти для детей, App Mit Inverot. Вот вроде просто- ставь блоки, пиши условия и значения, переменные и прочее... а в итоге не очень, ибо, повторюсь- знаний маловато очень, но что получилось то и получилось. А получилась первая версия программы M3APP (название было выбрано по имени терминал на windows mobile, да так и прижилось).
Много всего там было перепробовано- и голосовой ввод (для баловства), и добавление неизвестных товаров в базу (там и забросил это)... и код стал настолько громоздким и непонятным (хотя, казалось бы- блоки шлёп-шлёп, тужа сюда, плюс на минус, три на ум пошло и готово), и как то всё это работало, но реализация новых затей приносила лишь сумятицу и костыли в код. Было принято решение переписать с нуля, опираясь на первую версию приложения. И вот появилась вторая версия, сегодня. Много что не реализовано, например: - ручной ввод штрихкода - выбор товара из списка (если, например, нет веса или оторвалась этикетка) - экспорт накладной (для импорта, например, в 1С) - Работа с заказами ( чтобы в суматохе не перепутать товар и набирать его именно по списку) - С камеры можно считать только ean-13 и qr code, но нельзя ean-128 (возможно есть другие утилиты, которые могут). - и многое другое... Но потихоньку иду к этому и решил поделиться с вами результатом своего труда, чтобы получить порцию критики и советов. Чтобы знать что нужно ещё добавить, что изменить, что убрать... Готов к любой критике, равно как и к ушату...
1/4
Фото терминала на Android
И да- её можно скачать здесь, специально маленький сайтик сделал на серваке. P.S.- зарегистрировался и отправил на модерацию приложение в RuStore. Так смогу получить больше отзывов и, возможно, улучшу приложение... но это пока только в планах.
Напомню, два месяца назад мы заловились с товарищем @Stich.626 чтобы сделать единообразное + бесплатное мобильное приложение и сайт для расчета ценников в магазинах, которое решили не бросать, любить и лелеять, насколько это возможно.
В этом посте пойдет речь про обновление мобильной программы, и технические аспекты ее написания (все таки сообщество для разработчиков). Поехали!
Недооцененный баннер в Goggle Play
0 - Че там по отзывам
Перед выпуском обновления мы разумеется лезем в обе консоли разработчиков (приложение есть как в Google Play, так и в RuStore), и занимаемся вычитыванием того, что вы там понарасказывали в них, и какие хотелки запрашиваете.
Лично я придерживаюсь мнения, что разработчик (сайта, приложения, не важно) уже сам должен хорошо понимать, чего в приложении хватает (или не хватает), и на основе отзывов должна формироваться картина того, что должно ускорятся, или что добавлять в ту или иную итерацию.
А для всего остального есть MasterCard система тестирования и многочисленные метрики.
Так вот, среди отзывов уже давно проскакивали запросы на добавление списка с историей, сохранение результатов, сравнение нескольких выбранных показателей, и смена валют.
Сегодня вопросом списка с историей мы и займемся.
1 - Нарисуй меня полностью!
Первичный вход в приложение
Перед тем, как что-то наговнокодить написать, нам нужно сформировать в файлах макетов новые сущности для функционирования списка. В нашей основной деятельности появляется один новый блок, основанный на MaterialCardView из библиотеки поддержки M3, который содержит в себе:
Заглушку на основе RelativeLayout, которая показывается, когда еще не было произведено ни одного расчёта;
Сам список ListView, который находится внутри карточки, но невидим до тех пор, пока мы не начнем что либо считать.
Вариация макета при наличии расчетов
Визуально выглядит неплохо, но еще есть над чем поработать.
Дело в том, что ListView (древнейший из компонентов андроида, кста) в своем базовом варианте очень плохо выглядит. Настолько плохо, что если использовать его "как есть", то потом можно выхватить от пользователей лучи поноса:
Чтобы не повторять мем из картинки выше, мы создаем новый файл макета, в котором сверстаем 1 единственный пункт меню, который в дальнейшем будет повторятся, и добавляться к списку каждый раз при его заполнении данными.
Этот же файл, кстати, мы потом переопределим в адаптере, когда доберемся до кода.
В нашем случае получилась довольно простая адаптация, в которой:
Был добавлен корневой LinearLayout, позиционирующий дочерние элементы по горизонтали, с суммарным весом 9
Внутренние (дочерние) блоки, два из которых тоже на основе LinearLayout (но уже вертикально ориентированные), и еще один TextView, который нуждается только в центрировании
И уже внутри наши текстовые переменные, которым мы назначаем айдишки, и будем использовать в коде.
Но перед этим пойдем посмотрим, как это выглядит без учета логики на эмуляторе:
2 - Пишем внутренности
На виртуальном телефоне неожиданностей не произошло, отображается все так как хотелось, поэтому двигаемся в кодильню файл основной активности:
Перво - наперво, нам нужно уяснить несколько логических моментов:
При открытии приложения список уже есть, и поэтому он создается в onCreate. Но он пустой, так как мы еще не наполняли его данными.
Список уже знает, какими данными он будет наполняться (проставлены id и назначен наш кастомный слой), поэтому для него также создан адаптер, базирующийся на SimpleAdapter, который берет данные из HashMap. Он очень удобен (лично для меня), т.к. его можно в дальнейшем наполнять чем угодно: картинками, другими слоями, чекбоксами, и т.д.
Пока пользователь (ты) не начал ничего вводить, смысла показывать его тоже нет, поэтому мы изначально установили заданную видимость заглушки и списка в макете (не в коде). Заглушку видно, список нет.
Из хорошего, когда мы писали приложение в первый раз, то определили подсчет результата через switch - приложение знает, какой показатель мы считаем, поэтому нам просто нужно дать адаптеру сведения из того или иного метода расчёта.
Для этого мы добавляем две строчки кода для каждого из режимов. В первой добавляем данные, а второй говорим приложению, что список обновился (и тебе по-хорошему надо перерисовать список).
Например, для расчета по килограммам это будет выглядеть так:
Проверяем на телефоне, и неожиданностей опять нет - расчет прошел по тому показателю, который мы запрашивали.
3. Доделываем
Всего то 48 предупреждений.
Нам остается пройтись по инспектору, чтобы приложение выглядело не как гавно в глазах IDE более менее сносным (студия сама может проверить, что нужно улучшить или доправить):
Забиваем строковые ресурсы в string;
Раскладываем код по полочкам. Активности переносим в пакет activities, адаптеры в adapters;
Убираем код, который не использовали, или комментим его в TODO
Меняем индексы в приложении, добавляем информацию что мы там накрутили;
Обновляем пакеты, проверяем что из-за них ничего не поломалось.
Формируем AppBundle для Google Play, APK для RuStore (вторые еще толком не научились, а первые уже требуют).
И еще напоследок расшифрую некоторые моменты, которые я не упомянул до этого:
В приложении нет специального параметра (типа boolean до объявления в onCreate, или иного в SharedPrefs, например) для отображения или скрытия блока с заглушкой, так как мы полагаемся на жизненный цикл Android. Другими словами, если приложение было выгружено из памяти, или закрыто, нам не надо сохранять состояние списка, он все равно пересоздаст себя вместе с активностью. Если приложение разворачивается после скрытия (onResume), то все восстановится.
Список изначально не занимает всю площадь экрана, или не раздувается при наполнении (у него фиксированная высота). Это сделано специально, т.к. у нас еще не весь функционал реализован, и ниже будут дополнительные блоки/карточки.
ListView сам по себе является вертикально прокручиваемым по типу ScrollView, поэтому мы сохранили логику прокрутки внутри карточки, и заблаговременно сообщили слою Coordinator через параметр android:nestedScrollingEnabled="true", что вот ты, собака, должен (и будешь) прокручиваться. И даже ничего не сломали в плане юзабилити, пользователю понятно, что там внутри прокручивается список, т.к. есть соответствующая полоса прокрутки.
4 - Что дальше?
Дальше хотелось бы добавить оставшиеся вещи, в той очередности как я их вижу сейчас:
Сохранение результатов в свой собственный список + назначение названия. Например, хлеб в пятерке и в ашане;
Сравнение показателей по выбору их из истории, или из сохраненного списка;
Смена валюты через настройки, т.к. приложение опубликовано в 15 странах.
Публикую ссылки без зазрения совести, так как денег не прошу, а приложение бесплатное, каковым и останется. Ссыль на сайт опционально, для потенциальных вопросов по андроиду, предложений и всего такого.
Всё хуже и хуже каждый раз работает всё. Начиная от веб сайтов и заканчивая телефонной связью.
Раньше если находился какой-то баг, то его исправляли моментально, сейчас же, такое ощущение, что его не видят.
Например, позавчера (1 января) жена показала на своём яблоке, как у неё отображается сайт погоды на яндексе, краткий прогноз на неделю, 1-е число это был Понедельник. И так был такой баг
Я открыл эту же страницу на андрюхе и у меня отображается всё корректно. Да я конечно понимаю, яблочники тот ещё гемор создают, помню когда делал свой сайт в давно-лохматом году, тоже со стилями намучился подгоняя, всё под ИЕ и яблочный браузер, но тут то, Яндекс, он же Дзен. Я думал там работают люди, которые имеют сильный опыт в верстке, да и тестировщики по факту должны их прикрывать. Но тут....
И это только один пример из многих. И ВКонтакте глюк на глюке и глюком погоняет. Может в приложении работает всё гуд, но обычный браузер... Да, ВКонтакте особо никогда не отличались хорошей работой и периодически глюки всплывали, но тут, что-то всплывать они стали чаще.
Но как я говорил, это коснулось не только веб, но и качество связи. Мобильная связь от билайна, стала что-то с чем-то, как и предоставление других услуг, таких как интернет и тв.
Ну с нашей областью всё ясно, она никогда не славилась качеством услуг. Так вот хочется узнать, а в вашей области тоже стало всё "лучше"?
Учил девушку писать программу в Delphi, у нее лабы по программированию. Полчаса выбирали цвет окошка, кнопок и прочих элементов, где что расположить. Но все было как-то скучненько и монотонно.
На свою голову я рассказал, что можно на фон поместить компонент Image, в который можно вставить картинку. Вот нахрена я это сказал?
И я почувствовал на своей шкуре этот анекдот: "Решил научить свою девушку играть в танки. Полчаса выбирали форму танкистам"
Потом, после лабы, она рассказала, что у всех были скучные серые окошки, а у нее красивая и веселенькая программа. И за это она меня отблагодарила ртом, т.е. сказала: "Спасибо за помощь!"
В это время я:
И рисую себе веселенькие обои на смартфон:
Фоновое изображение для смартфона, "чистая версия"
При автопривязке к сетке все смотрится как мечта перфекциониста. Раставляю иконки, скриню, далее в графическом редакторе расставляю клеточки через одинаковые смещения. Поэтому и совпадает.
Но если автопривязка выключена, то наступает ад для перфекциониста, ни одна иконка не совпадает с фоновыми клеточками для иконок:
скриншот с этим фоном.
Иконка диктофона: ну, я пошел.
На заставку себе, когда был студентом, ставил расписание звонков на пары и выделял регионы, в которых появляются уведомления, часы и т.д.
Старый скриншот. Оригинальные обои на заставку не сохранились
Я ранее писал, что в Delphi можно на фон поместить компонент Image. А еще я отключал границы окошка и накидывал через Image кнопки, которые реагируют на нажатия. И хоть в стиле скинов Winamp делай лабу по программированию:
скрин скина Winamp, из интернета
Но про то, что можно скрин скина Winamp в фотошопе отредактировать и вставить в качестве фона программы, я решил девушке не рассказывать, это мой секретный ингридиент)
И да, я нигде не писал, что девушка моя, так, знакомая...