Pretty Painter – мое первое приложение под Android

    Pretty Painter


    Всем привет! Хотелось бы поделиться с вами своим опытом создания первого приложения под Android. И если вы уже давно присматриваетесь к этой платформе, но все еще почему-то не решаетесь начать разрабатывать свои приложения, то, я надеюсь, мой топик подтолкнет вас к этому. Под катом пять причин почему не нужно сомневаться и пора действовать и еще несколько интересных моментов.

    Исходные данные

    Веб-разработчик в творческом отпуске. Знания:
    • HTML/CSS — выше среднего
    • JS — средние
    • PHP — выше среднего

    + совсем небольшие познания в C#. Где же Java спросит читатель? Знаниями сего языка до разработки похвастаться увы не мог. И вот вам первая причина для того, чтобы приступить к разработке сейчас — «Не обязательно читать толстый мануал по Java».

    Книга: «Google Android. Программирование для мобильных устройств». Обязательно? Нет, если вы дружите с английским, достаточно документации на сайте. Если же все таки с английским все плохо, как, например у меня, мой вам совет, не читайте книжку от корки до корки, отобьете все желание. Пользуйтесь как справочным материалом — в этом плане она очень полезна. Причина вторая: «Не обязательно покупать книгу если вы хорошо владеете английским языком».

    Устройство: HTC Desire Z. А что без него никак? Я тоже так думал, поэтому поднакопил деньжат и все же купил, но в итоге мое приложение запустилось и на эмуляторе и итоговый результат был таким же как на смартфоне. Поэтому наличие устройства не критично, но если есть возможность, то лучше его приобрести. Причина третья: «Не обязательно покупать смартфон».

    Цель

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

    Процесс

    Процесс установки и настройки рабочего места описывать не буду, благо этот вопрос и его решение были озвучены уже не раз. Для создания редактора, мне нужно было понять как работают в Android с графикой. И первое что пришло на ум — это игры. Ведь там идет постоянная работа с графикой, что я и принялся изучать.

    Первым же запросом к гуглу я наткнулся на такой вот простенький шаблон игры. Распаковав архив я принялся изучать исходник. Смотря на причудливые super вместо parent, объявления классов в классе и переопределения методов при создании объектов невольно думаешь, а не повернуть ли назад? Но мы так просто не сдаемся.

    Разобравшись, что к чему, я создал каркас приложения на основе этого шаблона и начал творить. Довольно быстро я нашел статью про взаимодействие с сенсорным экраном и как ребенок радовался как под пальцами появляются круги. Тыкал в экран около часа, не меньше. Дальше, не долго думая, я убрал очистку экрана и оставил только рендер, предполагая, что теперь экран не будет очищаться и соответственно все, что пользователь будет рисовать, будет добавляться к уже нарисованному. В принципе так оно и было, но происходило это как-то странно. При долгом нажатии круги получались плотными, а вот при легком касании оставленная окружность мерцала. Как я понял, проблема была связана с сменой экранных буферов и такой топорный подход, как мой, тут не пройдет. Нужно было что-то другое.

    Решение было найдено в очень вовремя в попавшихся на глаза исходниках Sketcher. Оно заключалось в рисовании на поверхности основанной на изображении и последующей передачи ее на рабочую поверхность. Это приложение было просто золотой находкой, за что автору (WarGoth) огромное спасибо! В последствии я работал опираясь на него. А также без изменения использовал диалог выбора цвета. И вот вам и четвертая причина: «В сети очень много исходников готовых андроид-приложений и без пищи для ума вы не останетесь».

    В принципе пол-дела было сделано — приложение уже умело рисовать, осталось сделать интерфейс, меню и сформировать работу с пользователем, чем я и занимался последующие четыре дня. Описывать весь процесс думаю смысла нет, про все это действительно очень много информации. Далеко ходить не нужно, почти все необходимые знания я получил тут, на Хабре. В процессе работы возникали вопросы на которые я почти всегда находил ответы на stackoverflow. И это пятая причина для того, чтобы не откладывать изучение платформы в долгий ящик «Почти на все вопросы возникающие во время разработки можно найти ответы».

    Вот в принципе и все и я наверное прослыву Капитаном. Но так и есть, и все чаще авторы новых статей рассказывают уже очевидные вещи, а это значит что информации для старта уже достаточно. Поэтому, хватит раздумывать — пора действовать! Конечно если сообществу будут интересны какие-то конкретные моменты по приложению я могу их описать в отдельной статье, но пока причин для этого не вижу.

    Итог

    От появления идеи до создания приложения прошло 8 дней, еще два дня я подготавливал приложение к запуску. За это время я узнал, много нового о платформе, языке и тонкостях работы приложений и у меня появилось желание написать, что нибудь еще. Конечно, мне здорово помогли мои познания в верстке и программировании, но мне кажется главное тут, как и в любом деле, не знания, а желание.

    Ну и напоследок советы, которые помогут избежать головной боли:
    • Не стоит хранить важные переменные в потоках, они умирают при первой возможности. Наверное я бы про это знал если бы прочитал тот самый мануал по Java. Решением стало перенос переменных в класс вида
    • Если вы хотите, чтобы ваше приложение реагировало на поворот экрана, подумайте об этом заранее, так как при повороте приложение полностью перезапускается, решите как вы будете сохранять состояние
    • При программном изменении выбранного значения в элементе комбобоксе (Spinner) вызывается событие onOptionsItemSelected и непонятно откуда оно приходит, от пользователя или от приложения. Решением стало расширение класса Spinner и переопределение метода OnClick, которое вызывается при выборе пункта пользователем
    • Используйте стили для разметки, это может здорово помочь при изменении интерфейса или, например, при локализации, если надписи не будут умещаться на экране
    • Используйте ресурсы для хранения строковых переменных. Тогда локализация не доставит никаких проблем
    • Используйте системные ресурсы Android, дабы не плодить иконки, тексты и прочее. Я часто встречал копии системных иконок в исходниках. Ресурсы доступны через android.R в коде и android/ в разметке
    • При использовании анимации, прячьте объекты требующие активной перерисовки, такие как Surface, иначе анимация будет безбожно тормозить


    Теперь о самом приложении. Это обычная «рисовалка» с возможностью настраивать кисти, сохранять полученный результат и делиться им с друзьями. Оно не претендует на гениальность, но как мне кажется не лишено права быть выложенным на маркет. Прошу не судить строго, как никак первенец.

    Скачать

    А теперь, приятный, я надеюсь, сюрприз. Исходный код приложения открыт. Он не идеален и плохо комментирован, но со временем я все это исправлю. Пользуйтесь на здоровье!

    Спасибо за внимание.

    UPD
    В комментариях меня дополняют интересными ссылками и граблями. Думаю стоит дополнить пост:
    Источники кода для как-это-делается:

    Возможные грабли
    • SQLite не такой быстрый как кажется. На десятках тысяч записей начинает безбожно хромать. Только правильные индексы могут помочь.
    Share post

    Similar posts

    Comments 42

      +9
      Один из достойнейших топиков из разряда «Моё первое приложение под Android». Нет лишней воды и кода а-ля «hello world», чисто конкретика. Спасибо
        +1
        оч. содержательно, спасибо.
          +14
          Шли годы, а на Хабре каждую неделю всё появлялись «мои первые приложения для Андроида». Хотя статья и пример отличные
            0
            Так ведь пользуется этот уровень популярностью, вот и появляются.
            +2
            Весьма познавательно
              +2
              Очень легко читаемый код. И как для первого проекта — очень качественно! Спасибо.
              Мне показалось, что настройки Вы храните в файле. А почему не SharedPreferences?
                0
                Спасибо. Да, вы правы храню настройки в файле. Признаюсь честно немного поленился и использовал сериализацию для хранения целиком объекта PainterSettings. Ведь в случае SharedPreferences мне бы пришлось разложить все по полочкам, верно? Но любом случае так не оставлю, в будущем планировал доработать этот момент.
                  +1
                  Ваш класс, который хранит настройки, может реализовать интерйфейс Parcelable вместо Serializable. Тогда его можно будет непосредственно класть в Bundle через putParcelable.
                  Хотя если мне не изменяет память, должен быть метод наподобие putSerializable.
                    0
                    Хм, не знал. Спасибо. Надо будет реализовать
                +3
                Эх, как же мне когда-то не хватало такой статьи :)
                Лично мне помогли:
                code.google.com/p/apps-for-android/
                en.wikipedia.org/wiki/List_of_open_source_Android_applications

                Думаю, есть смысл добавить в статью, как источник кода для как-это-делается.
                  0
                  Спасибо! Дополнил пост.
                    0
                    Есть где скачать данное приложение, кроме Андроид Маркета?
                    Мне в маркете пишет, что приложение не совместимо и не дает скачать ни с компа, ни с планшета.
                    А дочке хотелось бы рисовалку, реальных аналогов не нашел, и на сайтах ссылка на меркет.
                    На 4pda нет в поиске.
                      0
                      Скачать можно из раздела downloads на GitHub. Но если Маркет сообщает, что несовместимо, значит скорее всего так и есть.
                        0
                        Маркет почти всегда при скачивании любого контента так и пишет.
                        Поэтому качаю все на 4pda.
                          0
                          Скачал, спасибо. Все работает.
                    0
                    Поставил себе — гораздо удобнее Скетчера. Спасибо!
                    И отдельное спасибо за вдохновляющее описание подхода к разработке.
                      +2
                      Вижу камень в мой огород :) Ниче, скоро будет новая версия с новыми плюшками — дошли руки наконец )
                        0
                        А теперь и тут, лично, спасибо! Добавил ссылку на ваш профиль в пост
                      0
                      Полностью поддерживаю автора! Не бойтесь начинать! Свое приложение первое я писал подольше, около трех месяцев по вечерам, потому что затронул слишком много областей. Порой проводил весь вечер в поиске, а некоторые мои вопросы до сих пор висят неотвеченные на stackoverflow.

                      А в целом — да, гармоничная платформа для разработки, особенно для тех, кто уже пишет на Java или C#. А после WPF/Silverlight xml-layout сразу как родной становится.

                      И еще одни возможные грабли — SQLite не такой быстрый как кажется. На десятках тысяч записей начинает безбожно хромать. Только правильные индексы могут помочь.
                        0
                        Спасибо! Добавил в UPD к посту
                        +1
                        А мне про свое первое приложение очень стыдно на Хабре писать, хоть и количесвто скачиваний уже за 100 000 перивалило.
                          0
                          Почему?
                            0
                            Не знал всех особенностей андроида, изобретал много велосипедов, при этом делал все это параллельно изучая java и ООП с нуля. Качество кода соотвестствующее.
                              0
                              Тогда разместить надо под заголовком — как я получил 100К скачиваний за приложение, собранное на коленке. И не открывать код. Мне сейчас больше интересно как продвинуть приложение, а то как-то ну совсем никак с текущим получается. А вроде ж полезное…
                                0
                                А что у Вас за приложение?
                                  0
                                  Продвинутый HelloWorld — карточки для изучения языков. Мне существующие не очень нравились тем, что словари в них фиксированные, а если надо добавлять — то все руками. А уж интерфейс у большинства — мама не горюй. В свое я добавил возможность импорта из браузера и файлов (PDF, etc) и прикрутил автоматический перевод. В общем — небольшой мэшап получился. Ну и пару плюшек в виде многоязычности и десятка словарей для популярных языков. Лежит здесь. Может расскажу чуть позже о нем, как статистики больше будет.
                            0
                            Почему перевалило если стыдно? Почему стыдно если перевалило?
                              0
                              Полтора года прошло с первого релиза.
                            +2
                            Кстати, кому интересно, почти год назад делал тоже рисовалку. Помните mrdoob.com/projects/harmony/? Вот я ее портировал в Sketcher и выложил на гитхаб: github.com/wargoth/Sketcher. Мне показалось, или автор немного подглядывал в мой код? Если так, то очень приятно. Ну а если нет, то видимо одинаково мыслим :)
                            +1
                            Nexus One с официальным Android 2.3.3: При нажатии «Меню -> Кисть» чистый экран с полоской, как я подозреваю этот, но кроме полоски ничего нет.
                              0
                              Спасибо. Посмотрю в чем может быть причина
                                +1
                                Программа обновилась, глюк не пропал. Подробное изучение выявило следующие: кнопки, бегунки и т.д., с вышеприведенного скриншота появляются при выборе в меню «Кисть», но их не видно. Т.е. если нажать туда, где должна быть кнопка выбора цвета — палитра открывается, но самой кнопки не видно. Глюк исчезает (прорисовываются кнопки) если выключит и включить экран (кнопка питания).
                                  0
                                  Да, обновление, к сожалению эту проблему не решало, т.к. я никак не мог ее выявить. Спасибо за подробное описание, теперь хотя бы приблизительно знаю в чем может быть причина. Если вас не затруднит не могли бы вы помочь с тестированием? К концу следующей недели руки освободятся и я буду готов продолжить работу над приложением, ваша помощь с устройством была бы очень кстати. Если у вас есть время/желание напишите, пожалуйста, свои контакты в личку.
                              0
                              По поводу необходимости покупки смартфона для разработки… Месяца полтора назад загорелся идеей, но вот как-то не заладилось с эмулятором работать — медленно очень, раздражает. Так что отложил изучение до покупки устройства.
                              Да, а разработка под какую версию Андроида актуальна, кстати? Что-то они вроде очень часто выходят, вроде :)
                                0
                                Не повторяй два раза два раза… чертов грипп :(
                                  0
                                  Да, есть такой момент, эмулятор серьезно подтормаживает, но если нет никакой возможности купить устройство, то как вариант хотя бы что-то.
                                  По версии. Писал под 2.1 но в конце пришлось сделать хитрый финт и поставить целевой пакет 2.2, при неизменной минимальной версии 2.1, чтобы приложение можно было переносить на SD
                                  0
                                  У меня нет слов, devolonter, прекрасный пост, после которого появляется желание начать писать и своё «первое приложение», но результат превзошел ожидания. Ваш пример на голову выше ранее упомянутых, на мой взгляд.

                                  Завтра буду сидеть и разбираться в написанном. Надеюсь внутри есть «человеческие» комментарии кроме «машинного» кода)
                                    0
                                    Спасибо, за приятные слова! Я буду рад если мой пример вдохновит вас на написание своего приложения. С комментариями в коде туговато, я было начал, но понял, что это убьет весь энтузиазм. Но я старался сделать код максимально простым для понимания. В ближайшее время постараюсь подробно все прокомментировать. В любом случае, вы всегда можете уточнить какие-то моменты лично, не стесняйтесь, спрашивайте. Все контакты указаны в профиле, да и тут почта есть ;)
                                    0
                                    Привет, надеюсь, ты не будешь против, если попиарю твою рисовалку на своем блоге про QR-коды и мобильные приложения www.proqui.com
                                      0
                                      Спасибо! Это поможет завоевать мир.
                                      Три года ищу пути как это сделать.

                                      Only users with full accounts can post comments. Log in, please.