Разработка андроид приложения на примере Калькулятора++. От идеи к реализации




    Идея


    Я, как бывший студент, а ныне инженер, часто провожу какие-либо расчёты «на лету»: будь то расчёт стоимости товара за кг, значение эффективного годового процента за кредит или построение графика распределения голосов на выборах.

    После нескольких минут поиска в андроид.маркете (который просто пухнет от представленных на нём программ) было установлено с десяток самых популярных калькуляторов. Но радость оказалась не полной… Всё мне не нравилось, всё было не удобно: где дизайн подкачал, где способ ввода, где постоянные падения. Тут и родилась идея: почему бы не написать свой калькулятор, — java я знаю хорошо. Пусть с андроид не работал — но зато опыта наберусь и скилы прокачаю, да и инструмент хороший получу.

    Анализ


    Более подробно остановлюсь на анализе нескольких приложений на андроид.маркете:

    1. RealCalc Scientific Calculator (анроид.маркет)

    Первым в списке идёт RealCalc — классический калькулятор с числом установок 5-10 млн. Средняя оценка: 4.7.

    Плюсы:
    1. Сайт поддержки хорош — там и help и changes и FAQ
    2. Привычный дизайн (здесь всё сугубо субъективно — мне не нравится)


    Очевидные* (* по моему мнению) недочёты:
    1. Невозможность ввода выражений
    2. Убогий дизайн (об этом ещё упомяну в конце главы)
    3. Скудный набор встроенных функций
    4. Невозможность построения графиков
    5. Обязательно использование знака умножения * (вместо 5sin(2PI) нужно писать 5*sin(2*PI))


    2. Cube Calculator Free (андроид.маркет)

    Число установок: 100-500 тыс. Средняя оценка: 4.8

    Плюсы:
    1. Более продуманный дизайн (по сравнению с RealCalc)
    2. Расчёт выражений
    3. История вычислений
    4. Расчёт выражений «на лету» (не нужно нажимать кнопку '=')


    Минусы (часть из них один-в-один как и в RealCalc):
    1. Функционал разбит на два экрана и нужно постоянно переключаться между ними
    2. Скудный набор встроенных функций
    3. Невозможность построения графиков
    4. Обязательно использование знака умножения * (вместо 5sin(2PI) нужно писать 5*sin(2*PI))


    3. Handy Calc (андроид.маркет)

    Число установок: 0.5 — 1 млн. Средняя оценка: 4.7

    Плюсы:
    1. Мощный функционал (построение графиков, решение уравнений и т.д.)
    2. Работа с документами (сохранение, загрузка)


    Минусы:
    1. Непонятный интерфейс — 2 экрана, на каждом своя кнопка = (выполняют разные функции)
    2. Для того чтобы попасть на экран дополнительных функций — нужно выполнить 3 действия (вызвать меню приложения, выбрать 'Tools', в появившемся меню выбрать 'Functions')


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

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

    Разработка


    Разработку приложения я начал ещё в июне 2011 в свободное от работы время. В качестве движка вычислений был выбран JSCL; элементы GUI по большей части написаны мною, некоторые позаимствованы с просторов интернета; библиотека для построения графиков — AChartEngine (хотя не идеальна и имеет ряд довольно странных решений). Здесь стоит, наверное, добавить, что хотя я и выбрал стороннюю библиотеку для вычислений, в скором времени мне пришлось её форкать и исправлять баги/дописывать нужный функционал (она, кстати, сейчас доступна у меня на github'е).

    В общем, было много фана, получено море опыта, выпита не одна чашка ароматного кофе и проведена не одна ночь перед компьютером.

    Сейчас проект находится в активной фазе — продолжает дописываться функционал, почти каждую неделю выходят обновления с новыми фичами, фиксятся баги.

    На момент написания статьи общее число собственных java классов в проекте равно 680 (включая внтренние классы), из которых 222 — в основном андроид-модуле (исходники), 276 — в модуле JSCL (исходники), 182 — в общем модуле (исходники).

    Релиз


    В какой-то момент времени я понял, что приложение уже готово для выпуска в массы. И после тестирования на устройствах коллег и знакомых Калькулятор++ появился в андроид.маркете.
    Было это 16 октября.

    Что получилось?




    Как я писал выше — основной ставкой в Калькуляторе++ (далее К++) был продуманный интерфейс.

    Распишу по пунктам какие особенности были добавлены в приложение для достижения данной цели:
    1. Каждая кнопка К++ помимо нажатия ещё умеет обрабатывать так называемый «свайп», т. е. Движение пальца в каком-нибудь направлении от её центра (на данный момент поддерживается свайп вверх и вниз, но уже в следующем релизе добавлю направление вправо). Какие выгоды от такого решения? В первую очередь, благодаря этому удалось на одном экране уместить очень большое число действий — от управления историей (см. клавишу «M») до простого ввода дополнительных функций и операторов (sin(), cos(), %, и т. д.). Это сразу же решило проблему нескольких экранов и переключения между ними.
    2. Подсветка синтаксиса — ни в одном из рассмотренных выше калькуляторов не использовался простой способ выделения математических термов — форматирование текста: в К++ каждый уровень вложенности выделяется более тёмным цветом, функция выделяется курсивом, а переменная или константа — жирным.
    3. Автоматическое форматирование чисел: 1 000 000.00 или 1'000'000.00.
    4. Если результат не помещается в окно вывода, то его размер автоматически уменьшается до подходящего (fit screen, проще говоря).
    5. Для частых операций работы с буфером (копировать/вставить) выделены отдельные клавиши.
    6. Окно вывода результатов обладает дополнительным функционалом — если при вычислении произошла ошибка, то по нажатию на него, всплывёт окно с информацией об ошибке; если результат — функция одной переменной — то всплывёт меню с выбором дополнительных действий: построить график/скопировать; в других случаях результат будет просто скопирован в буфер.
    7. Простая и в то же время редко используемая вещь — произведение вычислений без нажатия кнопки =.
    8. При вводе функции — позиционирование курсора внутрь скобок.
    9. Поддержка ландшафтного и портретного режимов.



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

    В добавок к интерфейсу, Калькулятор++ имеет ряд функциональных преимуществ:
    1. Огромное число функций (тригонометрический, гиперболические, функции сравнения, и т. д.).
    2. Символьное интегрирование (∫), дифференцирование (∂), суммирование (Σ), произведение (∏).
    3. Построение графиков.
    4. Вычисления в пространстве комплексных чисел.
    5. Возможность сохранения собственных переменных (увы, до функций ещё не добрался).
    6. Возможность «опускания» знака умножить.
    7. Вычисления с процентами.
    8. Вычисления в различных системах счисления и различных угловых единицах (градусы, радианы).


    Продвижение


    Сегодня не достаточно просто иметь хорошее приложение. Поэтому я потратил некоторое время на его продвижение.
    Далее представлены ключевые моменты в продвижении К++:
    1. Выкладка приложения на 4pda (помимо простого увеличения числа установок я получил бесценный фидбек от пользователей этого славного ресурса, за что им, кстати, спасибо).
    2. Обзор приложения в droider чарте. Опять же, спасибо создателям сего чудного обзора. За КОШ отдельный респект =) .
    3. Перевод на иностранные языки: изначально приложение поддерживало только английский и русский языки интерфейса, но благодаря добровольным стараниям Gabriele Ravanetti и Jordi Luna добавились, соответственно, итальянский и испанский. Большое спасибо им за это!
    4. Темы на других форумах, посвящённых андроид устройствам + reddit.com.


    График установок приложения:


    где
    1. Выкладка приложения на 4pda
    2. Droider обзор
    3. Перевод приложения на итальянский


    Примечание: испанский язык появится только со следующей версии.

    В этой главе также отмечу своё удивление тому, что для каждой страны продвигать приложение придётся отдельно (для меня было открытием то, что приехав в Европу и зайдя в андроид.маркет с местного компьютера, я не нашёл Калькулятор++ даже в первых 500 новых приложений). Конечно это хорошо для сильно локализованных приложений (расписания, переводчики и т. д.), но для приложений общего назначений — некий барьер.

    Что дальше?


    А дальше только одно — продолжение разработки; улучшение и допиливание приложения, вылизывание его кода для еще более удобной работы конечного пользователя.
    Считаю, что Калькулятор++ — достойный конкурент на рынке калькуляторов в андроид.маркете, и нисколько не жалею о начале его разработки.

    С вопросами, замечаниями, пожеланиями — связанными и не связанными с К++ — обращайтесь в личку или на почту, пишите комментарии. Обязательно отвечу =)

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

    Ссылки:
    1. Калькулятор++ на андроид.маркете
    2. Исходный код на github


    UPD Спасибо всем за замечания, ошибки, пожелания и комментарии.
    UPD 2 По просьбе читателей добавил QR-code
    UPD 3 На github'е есть небольшой issue tracker. Если не сложно, вводите туда баги, желаемые фичи и т.д., там будет проще мне с вами связаться + ни один запрос не будет пропущен.
    Метки:
    Поделиться публикацией
    Комментарии 64
    • 0
      Огромное спасибо, интересная статья и главное максимально информативная.
      • +21
        Прочитав заголовок, я думал, что увижу очередной мануал по разработке приложения с использованием Android SDK. Смените заголовок, пожалуйста.
        • +1
          Аналогично.
          • 0
            Абсолютно согласен.
          • –2
            А каков выхлоп от данного произведения искуства? Калькулятор выглядит просто изумительно, есть ли цели его монетизировать (или уже монетизировали)?
            • +6
              Спасибо за комплименты.

              Как вы видите, изначально, это всё было просто just for fun. Сейчас я всё чаще думаю о монетизации: скорее всего это будет классическое разделение приложения на два — первое, бесплатное, будет содержать рекламу, второе, платное, — нет.

              Я точно не буду:
              1. Урезать функционал бесплатного приложения
              2. Размещать рекламу в главном окне
              • –1
                Жду отчет через n! едениц времени о подходах и результатах монетизации ;)
                • +1
                  едИнство, едИный, ЕДИНИЦА же!
                  • –7
                    Я с Антарктики, мой родной Антарктический, русский в школе учил, на тройки.
            • +1
              Интересно будет посмотреть на график установок после хабраэффекта.
              • 0
                Хоть бы пару строчек кода вставили чтоле.
                • 0
                  Во-первых, для этого в конце статьи есть ссылка на исходный код (дублирую)
                  Во-вторых, вот моя статья, в которой приведены некоторые фрагменты исходного кода.

                  Что вас конкретно интересует?
                  • +2
                    Вам бы в я пиарюсь.
                    • +2
                      Я бы согласился, если бы не исходный код. Вот понадобится Вам реализовать, например, некую гиперболическую функцию на андроиде, а либы нигде не найдёте — и скачаете исходники автора.

                      Плюс автор показал на пальцах, как он анализировал рынок конкуретнов — очень интересно было почитать. Так что ИМХО, разработка, не я пиарюсь!
                • 0
                  Не думали подсветку синтаксиса сделать не изменением тональности, а цветами? При различном освещении и качестве экрана выражения могут быть трудноотличимы между собой по уровню вложенности. Нечто подобное, например, есть в Excel с диапазонами при вводе формул.
                  • 0
                    Думал, но так проще =) К тому же из цветовой гаммы не выделяется.
                  • +2
                    Вам бы в я пиарюсь.
                    • +1
                      промахнулся ответом
                      • +1
                        Видимо, проблема в карме =)
                      • 0
                        А вы не задумывались, что кнопка «равно» во всех калькуляторах, рассмотренных вами, расположена справа снизу не «просто так», а специально, чтобы им удобно было пользоваться одной рукой? В вашем же калькуляторе каждый раз необходимо тянуться большим пальцем чуть-ли не до другого конца экрана. Поэтому использовать его «на ходу» практически невозможно.
                        • 0
                          Ни в коем случае не нажимайте кнопку '='! Калькулятор всё посчитает сам. Она там оставлена только на всякий случай и для использования операции упрощения.

                          PS А в статье-то об этом писалось…
                          • 0
                            Да, только что заметил это пункт. Но тогда возникает вопрос, зачем «равно» нарисована как кнопка (которую так и хочется нажать:)?

                            P. S. А так хорошее приложение! Продолжайте в том же духе:)
                            • +1
                              Спасибо!
                              Кнопка оставлена на на всякий случай (результат строго говоря зависит не только от введённого выражения, но и от некого состояния, например, значения переменных, единиц измерений и т.д., и если по каким-то причинам результат не пересчитался при изменении этого состояния, пользователь сам может заставить его пересчитаться) и для использования операции упрощения .
                        • 0
                          Для теста решил посчитать банальное sin(30). Калькулятор пишет «Ошибка». Пробовал как в градусах, так и в радианах. В чем проблема? Вводил тоже самое в других калькуляторах — все работает на ура. ( пробовал в handycalc ).
                          • +1
                            Для таких случаев у меня есть unit тесты и, знаете, они проходят. Только что проверил на своём телефоне — тоже работает! Попробуйте нажать кнопку =; если ничего не изменится, напишите, пожалуйста, мне письмо — будем разбираться.
                            • +1
                              Извиняюсь, проблема была проста — я случайно включил бинарный режим.
                          • –1
                            Все рассмотренные выше калькуляторы имеют проблемы с отображением на Toshiba AC100 при отключении поворота экрана, интерфейс очень несимпатично размазывает. Этот момент был предусмотрен при разработке?
                            • +1
                              Про проблему с Toshiba AC100 не слышал.
                            • 0
                              e^(pi*i)-1 дает -16i. А должно быть 0.
                              • 0
                                простите, e^(pi*i)+1
                                • 0
                                  Принято, буду разбираться!
                                  • 0
                                    Самое интересное, что e^(pi*i) вычисляет как -1+0i
                                    • 0
                                      Да, я уже понял, что проблема только с e^(pi*i)+1. Всё остальное считается правильно =)
                                • 0
                                  Спасибо огромное за приложение. Оно действительно удобное. Только мне кажется что запись подынтегрального выражения нужно сделать через выражение dx, а не через скобки, но это мое личное мнение.
                                  • +1
                                    Прекрасно!
                                    Правда число классов — 680, удурчает, зачем такая прорва:)
                                    Напишите еще на форуме androidforums.com оно вроде как популярно у буржуев.
                                  • 0
                                    Не из желания потроллить, а просто из любознательности интересуюсь —
                                    расскажите, что за люди пользуются всем этим многообразием функций и построителями графиков в _ручном_ _калькуляторе_? Сколько их не Земле и как часто они это делают?

                                    т.е. я прекрасно понимаю, зачем бывают калькулятора с большой кнопкой +, кнопкой 000 и %,
                                    понимаю всякие мат.системки со своим встроенным языком, графиками и численными методами,
                                    но зачем гибрид?
                                    • 0
                                      Промахнулся, ответ — ниже.
                                    • 0
                                      Из любопытства!
                                      Всю жизнь мечтал написать какой-нибудь математический редактор (я учился на кафедре «Прикладной математики») — так почему бы не воплотить свою мечту в жизнь?

                                      Скажу больше — мне присылают очень много писем с благодарностями из разных стран мира, а это значит что кому-то такой гибрид нужен (кстати, число установок Handy Calc подтверждает эту гипотезу).
                                      • 0
                                        Вот как раз и интересно кому?
                                        Что они на нем делают и почему не делают другими средствами.

                                        Может быть им вообще не нужны функции, но душу греет их наличие.
                                        А правильный интерфейс может иметь еще бОльшее значение.
                                        • 0
                                          А правильный интерфейс может иметь еще бОльшее значение.
                                          Да, пожалуй, в большинстве случаев это так, но многие пишут, что К++ используют только благодаря его функциональным возможностям: вычислению комплексных чисел, построению графиков, большому количеству вспомогательных функция.

                                          Вот как раз и интересно кому?
                                          В следующий раз кто-нибудь напишет — обязательно спрошу.

                                          Кстати, в ближайшее время я подумываю о добавлении функций по вычислению часто используемых экономических величин: IRR, NPV и др.
                                          • 0
                                            Собственно я, как студент, достаточно активно использую подобного рода калькуляторы.

                                            Как правило, если ноут под рукой — счиаю на нем. Но он и заводиться будет дольше (ну да, минута примерно) и его еще где-то устаканить нужно. =)
                                        • 0
                                          А как дела обстоят с точностью вычислений на больших/малых числах?
                                          В свое время (2003 год вроде бы) один знакомый пытался заменить дорогой инженерный калькулятор
                                          на кпк (palmos или wince). Ни одна из найденных тогда программ «инженерный калькулятор»
                                          не давала точных результатов.
                                          • 0
                                            Точность — double. 16 значащих цифр.

                                            На самом деле это легко расширяемо, потому как напрямую с java.lang.Double работы не идёт — только через собственные обёртки, которые по необходимости могут быть заменены на BigDecimal.
                                          • 0
                                            Рылся недавно в маркете в поисках удобного калькулятора — из всех более менее устроил только ваш. Хотя, честно говоря, именно по степени удобства не встречал пока ничего лучше того, который встроен в стоковую прошивку Galaxy S — хотя там нет графиков и многих других функций, зато дизайн и удобство нажимания на кнопки ооочень хорошее ;)
                                            • +1
                                              установил, попробовал… +1 к благодарным пользователям!
                                              • 0
                                                Хороший калькулятор, начал пользоваться им не так давно. Глаз не радует слово ошибка, когда ведешь подсчет и еще не до конца дописал условия.
                                                • 0
                                                  Заметил очепятку на экране настроек: написано Системы счиЧления :)
                                                  Хороший калькулятор, RealCalc, пожалуй, снесу — этот удобнее и функциональнее
                                                  • 0
                                                    Представьте ситуацию: есть функция, которая используется чаще других, а есть, например, acos, который совершенно не нужен в повседневной жизни. Соответственно, хочется иметь возможность заменить одно на другое.

                                                    А в остальном — прекрасное приложение, спасибо огромное!
                                                    • 0
                                                      Я думал уже о кастомизации операций на клавишах, но пока что это не в приоритете.
                                                    • 0
                                                      Как раз вчера искал калькулятор без наворотов (RealCalc отпугивает одним своим видом!) и с расчетом выражений «на лету». Спасибо за своевременную (для меня) публикацию ;)
                                                      • 0
                                                        Странно, мне RealCalc, наоборот, понравился внешним видом — как какой-нибудь инженерный калькулятор Casio, с которого скопировано расположение кнопок.
                                                      • 0
                                                        Эх, если бы можно было SMath Studio как-то использовать на емкостных экранах.
                                                        ИМХО, это — лучшая математическая программа на PDA…
                                                        • 0
                                                          Супер, буду пользоваться
                                                          • 0
                                                            > Обзор приложения в droider чарте. Опять же, спасибо создателям сего чудного обзора.

                                                            А сколько это стоило?
                                                            • 0
                                                              Нисколько. Я им написал письмо, они ответили что понравилось. И добавили в следующий видео обзор.
                                                            • 0
                                                              Отличный калькулятор! Можете смело монетизировать, я бы заплатил бы немного. Если планируете не забрасывать, конечно
                                                              • 0
                                                                Отлично! Не ожидал, что найду что-то удобнее простого инженерного. За бесплатность и обещания не делать рекламу на главном экране отдельное спасибо.
                                                                • 0
                                                                  Бесплатно? Вы бесподобны. Я попользуюсь, и если понравится задоначу. Спасибо огромное!
                                                                  • 0
                                                                    Спасибо за приложение, а за открытый код вам просто отдельная огромная благодарность :)

                                                                    Заметил забавный баг, когда вводишь «25x^2+6x» и между 6 и x пытаешься поставить 0, ставится шесть (то есть вместо 60x получается 66x) и в результате выдает ошибку
                                                                    Samsung galaxy mini
                                                                    • 0
                                                                      Исправлю в новой версии! Ждите обновления!
                                                                    • 0
                                                                      Добавьте, пожалуйста, QR-code на K++

                                                                      P.S. Спасибо за интересную статью
                                                                      • +1
                                                                        Спасибо, уже не раз на сессии помогло ))
                                                                        • 0
                                                                          пользуюсь несколько лет. спасибо)

                                                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.