Поговорить об архитектуре всегда интересно, в особенности когда ты ее используешь повсеместно во всех своих приложениях. Сейчас очень популярно и модно везде использовать MVVM архитектуру которую я описывал тут буквально недавно.
Сегодня я хочу поговорить про такой паттерн который используется в большинстве современных приложений, который называется MVP, на его замену пришел уже названный ранее MVVM который является более простым и понятным паттерном, но MVP в современной разработке используется везде где можно и нельзя, и так же она имеет применение в мобильной разработке, которую я так сильно люблю.
Android programmers blog
Simply about difficult
Поиск по этому блогу
вторник, 6 августа 2019 г.
воскресенье, 4 августа 2019 г.
Программная нарезка видео с помощью mp4parser
Продолжаем работать с видосиками. У меня недавно был случай что потребовалось нарезать один видео файл на много маленьких файлов вырезая ненужные части. И я такое запедалил с помощью замечательной библиотеки от Google которая называется mp4parser.
Эта библиотека позволяет помимо нарезки так же:
— соединять файлы у которых одинаковые настройки енкодинга;
— накладывать аудио дорожку на видео;
— изменение или добавление меты;
Библиотека очень мощная, вот прям не могу даже ничего плохого про нее сказать. Очень быстро справляется со всеми задачами, прямо вот в долю секунды. Однажды пробовал нарезать огромный видео файл на несколько частей, так либа справлялась за 2 — 3 секунды, даже боюсь представить как они это сделали, там реально какая-то магия.
Эта библиотека позволяет помимо нарезки так же:
— соединять файлы у которых одинаковые настройки енкодинга;
— накладывать аудио дорожку на видео;
— изменение или добавление меты;
Библиотека очень мощная, вот прям не могу даже ничего плохого про нее сказать. Очень быстро справляется со всеми задачами, прямо вот в долю секунды. Однажды пробовал нарезать огромный видео файл на несколько частей, так либа справлялась за 2 — 3 секунды, даже боюсь представить как они это сделали, там реально какая-то магия.
пятница, 2 августа 2019 г.
Реализация очереди задач в Android
Бывают такие задачи в которых приходится распределять работу функционала, что бы каждая задача выполнялась после окончания предыдущей. В таких случаях обычно пихают внутри колбека об окончании процесса что бы стартовал новый процесс, это выглядит не очень красиво, сильно грубо и нагромождено.
В таких случаях обычно стараются использовать такую штуку как очередь. Она помогает поставить процесс понятно и легкоизменяемо, каждый просесс выполняется в отдельном потоке, отдельном классе, и никак не задевает работу следующего или предыдущего процесса, все предельно понятно и логично.
пятница, 19 июля 2019 г.
Запись экрана с помощью фонового сервиса.
Бывют такие не типичные задачи, когда нужно на пример записывать экран смартфона, то что там происходит, паузить, резюмить и останавливать запись. Записывать это все в видео файл, и дальше уже выполнять над ним какие-то действия.
Данный функционал требует нескольких этапов для старта записи. Первый этап — это старт сервиса который проверяет есть ли перманентный доступ на запись, если его нету, то мы переходим ко второму этапу — это запрашиваем доступ на запись, если пользователь дает доступ на запись, тогда мы переходим на третий этап — мы начинаем запись. Это такой небольшой алгоритм который будет при вызове метода startRecording.
Наше приложение будет представлять из себя один экран с кнопкой по нажатию на которую мы будем запускать наш сервис по записи экрана, после повторной записи мы будем останавливать запись и отображать нотфикейшн который будет по клику запускать видео что бы его можно было просмотреть.
Наш сервис будет сам по себе отдельным модулем который можно просто перенести в любой другой проект, и он будет независимо выполнять свою функцию. Для начала нам нужно будет создать сервис который мы будем вызывать из хелпера, котороый в свою очередь будет вызывать диалог с вопросом можно ли записывать экран, и после получения разрешения начнет записывать. Так же можно расширить функционал и добавить сервис с плавающей кнопкой по нажатию на которую будет останавливаться запись или какие-то другие действия.
Вот такой у нас будет флоу действия. Теперь можно приступать к разработке. И начнем мы с сервиса который будет производить запись экрана. Но для начала нам нужно создать несколько листенеров которые будут кидать колбеки в хелперов и получать их обратно.
Данный функционал требует нескольких этапов для старта записи. Первый этап — это старт сервиса который проверяет есть ли перманентный доступ на запись, если его нету, то мы переходим ко второму этапу — это запрашиваем доступ на запись, если пользователь дает доступ на запись, тогда мы переходим на третий этап — мы начинаем запись. Это такой небольшой алгоритм который будет при вызове метода startRecording.
Наше приложение будет представлять из себя один экран с кнопкой по нажатию на которую мы будем запускать наш сервис по записи экрана, после повторной записи мы будем останавливать запись и отображать нотфикейшн который будет по клику запускать видео что бы его можно было просмотреть.
Наш сервис будет сам по себе отдельным модулем который можно просто перенести в любой другой проект, и он будет независимо выполнять свою функцию. Для начала нам нужно будет создать сервис который мы будем вызывать из хелпера, котороый в свою очередь будет вызывать диалог с вопросом можно ли записывать экран, и после получения разрешения начнет записывать. Так же можно расширить функционал и добавить сервис с плавающей кнопкой по нажатию на которую будет останавливаться запись или какие-то другие действия.
Вот такой у нас будет флоу действия. Теперь можно приступать к разработке. И начнем мы с сервиса который будет производить запись экрана. Но для начала нам нужно создать несколько листенеров которые будут кидать колбеки в хелперов и получать их обратно.
суббота, 6 июля 2019 г.
PopupWindow который указывает на view вызывающий его
Случается так что приходится делать выпадающее меню которое указывает на вью которое его вызвало и в нем выводить какие-то данные красиво, собственно я недавно столкнулся с такой штукой и теперь хочу поделиться с тем как я это сделал.
У нас будет вообще элементарный пример, будет кнопка которая будет бегать по экране по клику на другую кнопку, а кнопка которая перемещается по экрану, по клику, будет вызывать диалог прицепленых к данной кнопке.
Никакие библиотеки нам в этот раз не понадобятся, никакие расширения дополнительные тоже. Использовать мы будем стандартный ListView для создания списка и обычный ArrayAdapter для написания адаптера для списка. Единственное что нам понадобится так это минимальная версия проекта minSdkVersion 19, так как для использования showAsDropDown() нужно иметь минимальный SDK 19.
пятница, 5 июля 2019 г.
Проектируем приложение с MVVM
Я уже писал про ViewModel у себя в блоге, но я писал немного про другое использование данного класса, там мы рассматривали сохранение состояния данных при вращениии экрана что бы мы не теряли данные. Сейчас же мы поговорим про паттерн MVVM который используется для визуального упрощения кода и устанавливает правила для каждого класса выполнять свою работу.
Что же такое MVVM? Вот выдержка из википедии:
Model-View-ViewModel (т.е. MVVM) — это шаблон архитектуры клиентских приложений, который был предложен Джоном Госсманом (John Gossman) как альтернатива шаблонам MVC и MVP при использовании технологии связывания данных (Data Binding). Его концепция заключается в отделении логики представления данных от бизнес-логики путем вынесения её в отдельный класс для более четкого разграничения.
среда, 3 июля 2019 г.
Affter Effect анимация с помощью Lottie
Недавно пришлось столкнуться с такой штукой как работа с анимацией которая была экспортирована из Affter Effect. Она была красивая, все переливалось, но реализовать такое стандартными методами было просто нереально, но потом мне расказали про Lottie которая была создана AirBnb для своих нужд, но в дальнейшем выпущена в публичный доступ для всех желающих. Эта библиотека позволяет проигрывать анимации экспортированные как json файлы из Affter Effect буквально в пару строчек кода.
вторник, 2 июля 2019 г.
AutoPlayRecyclerView для проигрывания видео в списке автоматически
Очень давно я ничего не писал себе в блог, но настоло время вспомнить старые добрые времена и снова заняться этим грязным делом. Наверняка многие сталкивались с такой штукой как автоплей в разного рода приложениях, когда ты доходишь до видео в фиде, и оно начинает автоматически играть. Такую штуку можно сделать разными способами, есть готовые библиотеки которые уже реализовали эти решения, есть либы которые имеют баги, ну или в моем случае мне нужно было реализовать не обычный плеер, из-за этого решения которые я находил не подходили просто мне.
Мой же пример ориентирован больше на людей которые любят собственные решения и которые хотят понимать что происходит у них в приложении и как это все работает. Опять же, сразу скажу что вариант который я использую в этой статье не мое личное решение, я его нашел на просторах Github'a, и при чем не у одного человека, по этому я не могу утверждать кому оно пренадлежит, но к сожалению оно было изобретено до меня и я могу только им пользоваться. :)
В случае с этой статьей, я просто приведу пример своего кастомного RecyclerView который я использовал для проигрывания видео в списке. Но так же хочу привести примеры уже готовых решений, таких на пример как Toro Player, который реализован на основе ExoPlayer'a и который выполняет свою работу просто отлично, но к сожалению я не смог найти ему применения у себя в проекте. Но сразу скажу что я советую его всем кто хочет сделать у себя автоплей, стандартный с одним плеером в айтеме — это то что вам нужно.
среда, 23 мая 2018 г.
Пример использования ViewModel
Что-то побудило меня написать статью про эту новую фичу. Погуглив пару секунд я наткнулся на замечательную статью на Medium'e, пример который я привожу тут взят оттуда, только с небольшим моим дополнением, а так по сути это реплика статьи с Medium'a…
Часто бывает когда сталкиваешься с проблемой поворота экрана, данные просто теряются при обновлении активити, и приходится или вызывать снова запрос на получение или сохранять эти данные в onSaveInstanceState().
ViewModel же помогает сохранять инстанс любого объекта который вы имеете, пусть то будет модель какого-то респонса с сервера, или на пример модель в которой хранятся локальные данные для текущей активити. При повороте экрана да и вообще на протяжении всего жизненого цикла приложения данная информация будет жить пока вы не закроете приложение вообще.
Часто бывает когда сталкиваешься с проблемой поворота экрана, данные просто теряются при обновлении активити, и приходится или вызывать снова запрос на получение или сохранять эти данные в onSaveInstanceState().
ViewModel же помогает сохранять инстанс любого объекта который вы имеете, пусть то будет модель какого-то респонса с сервера, или на пример модель в которой хранятся локальные данные для текущей активити. При повороте экрана да и вообще на протяжении всего жизненого цикла приложения данная информация будет жить пока вы не закроете приложение вообще.
вторник, 22 мая 2018 г.
GalleryView своими руками
В одном из своих проектов столкнулся я с хотелкой заказчика что бы у нас был слайдер с превьюхой под картинкой, ну то есть обычная галерея. Ну я не долго думаючи взял родную галерею и увидел что ее уже не желательно использовать на устройствах, а замены как таковой нет, ну я и решил написать свою вьюху что бы уже не заморачиваться, тем более есть такая великая штука как RecyclerView которая умеет все.
Вот такая вьюха с картинками будет. Она будет уметь по нажатию на айтем отображать его в большом виде, ну там окрашивать выбранный айтем вокруг в синенький цвет, что бы было понятно какой выбран ну и т.д.
Подписаться на:
Сообщения (Atom)