Шпаргалка по material-интерполяторам

В гайдах Material Design по анимациям первым же пунктом прописано требование к «authentic motion», т.е. к живому, не-механистичному движению объектов на экране. В частности просят «natural acceleration and deceleration»; в общем, речь в первую очередь идёт об интерполяторах.

В support-библиотеке уже содержится три самых необходимых класса: FastOutLinearInInterpolator, FastOutSlowInInterpolator и LinearOutSlowInInterpolator. Однако я до сих пор регулярно в них путаюсь, а лаконичные описания из документации…

Uses a lookup table for the Bezier curve from (0,0) to (1,1) with control points: P0 (0, 0) P1 (0.4, 0) P2 (1.0, 1.0) P3 (1.0, 1.0)

…навевают некоторое уныние и стойкое ощущение себя гуманитарием.

Потому я просто оставлю здесь краткую шпаргалку: кто есть кто и когда кого использовать.

Читать далее

isUserAGoat(): шутка Google

Среди встроенных в Android SDK инструментов автоматизированного тестирования есть небольшая утилитка monkey. Это своего рода симулятор бешеной обезьяны, которой попал в лапы смартфон с запущенным приложением: утилита генерирует мощный поток случайных тычков, жестов и нажатий кнопок. Если приложение в таком режиме не рухнуло и не зависло, то сей факт уже говорит о некотором качестве.

Боевой Бибизян
Что ломать изволите?

При этом самому тестируемому приложению оставлена возможность определить запуск monkey с целью подтасовать результаты. Шутка: с целью предотвратить излишние последствия при таком тестировании, разумеется. Скажем, файловый менеджер может перед удалением каталога проверить: а человек ли требует выполнить эту операцию? Если до удаления случайно дотыкалась автоматическая обезьяна, то лучше этого всё же не делать. Отвечает за проверку статический метод isUserAMonkey() класса ActivityManager, но документирован он плохо.

Читать далее

To log, or not to log: включаем и отключаем LogCat для debug-версии

Сразу скажу, эта заметка — сборник простых и полезных рецептов, ничего более. Пожалуй, стоит даже отнести её к советам для новичков, потому что бывалые разработчики давно уже сделали для себя нечто подобное. Речь идёт о возможности автоматически отключать лишний вывод в LogCat для release-версии приложения. Или, выражаясь иначе, о возможности добавить больше отладочного вывода в debug-режиме, да ещё и получить поддержку со стороны IDE.

Необходимость подобного решения очевидна: debug-версии часто выкидывают в LogCat кучу полезной для разработчика информации, которую в релизе лучше бы скрыть подальше от любопытных глаз. И даже если прятать нечего, загаживать лог в любом случае нехорошо.

Android и его LogCat
Честно утянутая лучшая картинка по запросу LogCat

Решение состоит из двух подзадач: первая — определение наличия отладочного режима в приложении, вторая — написание вспомогательного логгера и добавление его поддержки в IDE.

Читать далее

Material Drawer: новые материалы от Google

«Всё течёт, всё меняется» — говорил когда-то Гераклит Эфесский. И если течь в наших программах вообще-то ничего не должно, то уж меняться им в любом случае приходится постоянно. Правила нашего айтишного зазеркалья никто не отменял: «нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее».

Казалось бы, прошло совсем не так уж много времени с момента написания прошлой заметки про DrawerLayout, но Google уже успел выпустить новые требования к оформлению приложений, известные как Material Design. Дизайнерам и пользователям Материал явно пришёлся по вкусу, а потому придётся ему соответствовать.

SlidingDrawer в Material на примере Gmail
SlidingDrawer в Material на примере Gmail

Собственно, на скриншоте можно увидеть все новые требования к drawer-ам:

  1. Панель должна открываться поверх action bar (а не под ним, как ранее)
  2. Панель должна «подъезжать» под status bar на Lollipop и выше.

Забегая вперёд — то и другое реализуется без особых сложностей, всё уже готово, но… как водится, некоторые хитрости придётся применить. Итак:

Читать далее

Talkback на custom view: заставляем Android читать что угодно

Android Talkback свалился на меня неожиданно. Сказал бы даже — я совершенно внезапно узнал о его существовании.

Вроде бы совсем недавно всех устраивал один из кастомных контролов в нашем Android-приложении (унаследованный напрямую от View и рисующийся, соответственно, вручную), как вдруг однажды эта идиллическая картина была единым махом разбита в прах жалобой от незрячего пользователя: у него не работает Talkback.

Одно движение — и Talkback включится
Одно движение — и Talkback включится

Откровенно говоря, слово «Talkback» я узнал только из багтрекера, читая задачу «срочно починить!». Потому что если человек может видеть хотя бы в очках, то никогда не включит эту функцию и даже не задумается о ней. Talkback — инструмент Android Accessibility, средство для чтения с экрана, позволяющее тыкать пальцами в самом прямом смысле вслепую. Механический голос вполне нормально зачитывает текст со встроенных в систему контролов (Button, TextView, WebView и т.д.), но вполне естественно, что полностью кастомный View ему представляется чёрной дырой.

Читать далее

FloodFill на JavaScript

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

Я лениво ковырялся в старых фотках, в недописанных или давно устаревших заметках, в древних версиях программ и библиотек, в своём заброшенном коде… и вот тут-то я ВНЕЗАПНО наткнулся на целый графический редактор на JavaScript, причём полностью собственного написания!

Интерфейс редактора
Интерфейс редактора

Подумать только — у меня было время и были силы на создание подобных вещей, да ещё и 100% самостоятельно, включая всяческую графику! Это же уму, как говорится, нерастяжимо! В общем, испытав лютую зависть к самому себе, я полез разбираться в код — и вспомнил, что алгоритм заливки области цветом (FloodFill) тоже написан когда-то полностью мной, да ещё и работает безошибочно и почти мгновенно! На любых областях!

Читать далее

DrawerLayout: панели справа и слева одновременно

В недавней статье про DrawerLayout была мельком упомянута возможность сделать сразу две выезжающие панели — справа и слева, по образу и подобию клиента Google+ и ряда других приложений.

Правая панель в Google+
Правая панель в Google+

В качестве финальной, третьей части цикла статей (вторая часть была про скрещивание DrawerLayout и ActionBarSherlock) мы попробуем повторить в точности такое же поведение двух разных панелей на экране.

Читать далее

DrawerLayout и ActionBarSherlock: скрестить ужа и ежа

Многие знают, что у проекта ActionBarSherlock некоторое время назад появился официальный конкурент от Google: 18-я версия Android Support Library среди прочих плюшек принесла и долгожданный ActionBar в режиме совместимости.

Похоже, под закат линейки 2.x Корпорация Добра всё-таки признала необходимость хоть какого-то единообразия внешнего вида приложений; раньше официальная позиция фактически сводилась к требованию писать две программы, с action bar-ом и без него. Естественно, Шерлок на фоне такого маразма быстро взлетел в топы используемых библиотек, а его автор, — Jake Wharton, — стал широко известным в узких кругах человеком. Но есть ли смысл отказываться от ActionBarSherlock сейчас?

Нет. Нет смысла.

Читать далее

DrawerLayout: панелька из Гугла

Похоже, Google всё серьёзнее берётся за унификацию внешнего вида и поведения приложений под Android. Нет, серьёзных репрессивных мер пока что не ожидается, но правилами Google Play с недавнего времени жёстко запрещён вносящий путаницу софт (и, хвала богам, AirPush тоже наконец-то!), а раздел Design на Android Developers регулярно пополняется новыми подробными рекомендациями. И не просто теоретическими, а подкреплёнными набором инструментов для разработчиков!

DrawerLayout в действии
DrawerLayout в действии, демо-приложение

Одним из рекомендуемых (и уже знакомых) подходов к построению интерфейса является Navigation Drawer — панелька, выезжающая сбоку по нажатию на action bar или по свайпу с края экрана. Для её реализации готовы все технические средства, и написан официальный мануал разработчика, — но, пожалуй, слишком многословный и при этом не затрагивающий ряда тонкостей. Потому здесь я попробую исправить этот недочёт.

Читать далее

Android: повернуть картинку через XML

Иногда в Android-проекте требуется иметь несколько версий одной и той же картинки, но с поворотом на определённый угол. Скажем, речь может идти об указывающих на что-то стрелках, «хвостиках» контекстных balloon-ов, градиентных границах и тому подобной графике.

Конечно, требования к некоторым картинкам бывают таковы, что дизайнеру приходится вращать их вручную, дорисовывая недостающие детали. Но если кроме угла поворота никаких отличий нет, то плодить много графических ресурсов попросту неразумно: растёт размер .apk, усложняется внесение изменений, да ещё и нарушается принцип «работать должна машина»… в общем, неудивительно что подобные сценарии учтены в Android с самых первых версий, и мы можем со спокойной совестью пользоваться уже готовым инструментом. Например, на скриншоте ниже использовано только одно растровое изображение оранжевой стрелочки — то, что в заголовке. Остальные варианты получены через xml drawables, без единой строчки java-кода!

Поворот одной и той же картинки на разные углы
Поворот одной и той же картинки на разные углы

Читать далее