
Я обычный пользователь, далёкий от профессионального программирования. Но каждый раз, открывая очередную читалку на Android, я испытывал раздражение: то реклама всплывает посреди абзаца, то интерфейс перегружен функциями, которыми не пользуешься, то приложение тормозит на старых книгах. В какой-то момент я понял: хватит. И решил написать свою читалку. Ниже — история о том, как человек без опыта разработки создал приложение MRead, которое теперь использую сам и делюсь с вами.
Почему готовые читалки бесят?
Перепробовав с десяток приложений, я выделил три основные проблемы. Во-первых, реклама. Даже в платных версиях иногда проскакивают баннеры. Во-вторых, раздутый функционал: синхронизация с облаком, магазины, социальные кнопки — мне нужно просто читать. В-третьих, скорость. Открытие большого файла EPUB может занимать секунды, а скролл страниц сопровождается микро-лагами.
Я хотел минималистичную читалку, которая делает только одно — показывает текст книги. Без лишнего. И чтобы управление было интуитивным: тап по левой части — назад, по правой — вперёд, свайп для быстрой прокрутки.
«Когда готовые инструменты не решают твоих проблем, единственный выход — создать свой. Даже если ты не программист.»
Как я решил написать свою (и не бросил)
Изначально я думал, что программирование — это сложно. Но оказалось, что для простого приложения достаточно базовых знаний Java и Android Studio. Я прошёл несколько туториалов на YouTube и прочитал документацию. Через неделю у меня был прототип, который открывал EPUB-файл и отображал текст. Энтузиазм подогревал тот факт, что я сам контролирую каждую строчку.
Главная трудность — работа с EPUB. Этот формат представляет собой ZIP-архив с XHTML. Пришлось разобраться с парсингом. Я использовал библиотеку epublib — она с открытым исходным кодом и проста в интеграции. Весь процесс сборки выглядел так:
// Пример загрузки книги в MRead
EpubReader reader = new EpubReader();
Book book;
try {
book = reader.readEpub(new FileInputStream(epubFile));
Resource resource = book.getCoverImage(); // работа с обложкой
} catch (IOException e) {
e.printStackTrace();
}Архитектура MRead: минимализм и производительность
Приложение состоит из трёх экранов: библиотека, чтение и настройки. Для отображения текста я использовал WebView — он легко справляется с HTML-разметкой EPUB. Но стандартный WebView потребляет много памяти, поэтому я отключил JavaScript и кэширование. Результат: книга открывается за 200 мс, листание мгновенное.
Одна из фишек — кастомные жесты. Я реализовал детектор свайпов: взмах влево-вправо для перелистывания, вверх-вниз для изменения яркости. Вот код обработчика:
gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
float dx = e2.getX() - e1.getX();
if (Math.abs(dx) > SWIPE_THRESHOLD) {
if (dx > 0) {
// предыдущая страница
} else {
// следующая страница
}
return true;
}
return false;
}
});Сравнение MRead с популярными читалками
| Параметр | MRead | FBReader | Moon+ Reader |
|---|---|---|---|
| Реклама | Нет | Есть (в бесплатной версии) | Есть (в бесплатной) |
| Размер APK | 2.5 МБ | 8 МБ | 15 МБ |
| Поддержка жестов | Да (свайпы, тапы) | Частично | Да |
| Синхронизация | Нет (локально) | Google Диск | Dropbox, Google |
| Скорость открытия EPUB (10 МБ) | 0.2 с | 1.5 с | 1.0 с |
| Подсветка | Да (ручная) | Да (авто) | Да (сложные режимы) |
Ключевые фишки, которые не дают перейти на другие
Во-первых, отсутствие рекламы — это база. Во-вторых, настраиваемые зоны тапа: я могу назначить, что тап по левому верхнему углу открывает оглавление, а по нижнему — выключает подсветку. В-третьих, полная оффлайн-работа: никаких запросов сети, только файлы.
Кстати, MRead поддерживает пакетное добавление книг из папки. Просто кидаешь EPUB в нужную директорию — приложение само обновляет библиотеку. И никаких переиндексаций.
«Когда делаешь продукт для себя, не нужно гадать, чего хотят пользователи. Ты и есть пользователь.»
Как собрать MRead самому
Исходный код я выложил на GitHub. Для сборки потребуется Android Studio и JDK 11. Клонируете репозиторий, открываете проект, жмёте Build. Приложение поддерживает API 21+ (Android 5.0). Учитывайте, что я не профессиональный разработчик, поэтому код может быть неидеальным. Но он работает.
git clone https://github.com/yourname/mread.gitПосле сборки вы получите APK, который можно установить на телефон. Я рекомендую отключить в телефоне оптимизацию батареи для MRead, чтобы фоновая подсветка всегда работала стабильно.
Часто задаваемые вопросы
Поддерживает ли MRead PDF? Пока нет, только EPUB. PDF планирую добавить в следующей версии.
Можно ли менять шрифты? Да, в настройках можно выбрать любой TTF-файл из памяти устройства.
Будет ли версия для iOS? В планах нет, я использую Android.
Личное наблюдение автора
Написание этого приложения заняло у меня около месяца по вечерам. Сейчас я читаю исключительно в MRead, и меня перестало бесить то, что раньше казалось неизбежным. Если вы тоже устали от «тяжёлых» читалок — попробуйте написать свою. Это не так страшно, как кажется, а результат приносит настоящее удовлетворение.