Pull to refresh

Comments 18

Что только не делают, лишь бы svg не использовать.
Для каждого значка есть четыре версии, соответствующие разной плотности пикселей
попробуем их раскрасить. Я буду использовать для этих целей десктопную Java

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

Конечно же одна векторная картинка будет более корректным решением. Где-нибудь есть эти же значки в виде png? Если есть векторные исходники для Adobe Illustrator — их наверняка можно как-то автоматически экспортировать.
Можно (могу) самому в принципе сделать. Если андроид в интерфейсе не умеет svg в принципе, то
а) маленький скрипт расторизации на imagemagic и запихивания по отдельным папкам
б) решение для андроида в виде расторизации перед представлением
в) поддержка svg в андроиде
Нашёл статью http://habrahabr.ru/company/twins/blog/166093/

Насколько я понял, в андроиде нет нативной поддержки SVG (ну кроме браузера, однако нас на данный момент не он интересует) для интерфейса. С помощью сторонних библиотек это можно сделать, но там, как видно из статьи, будут проблемы.

Если гугл нативно не поддерживает SVG — на это есть какие-то явные причины. Сколько я не читал статей и руководств — повсюду рекомендуют использовать растровые изображения разных размеров. Если автоматизировать процесс создания из одной картинки нескольких под разные плотности — всё не так трудно получается. Хотя надо не забывать, что это по-факту один размер под разные плотности пикселей, и он не растягивается.
Единственная причина, по которой вектор может не использоваться — чуть более требователен к ресурсам, так как в промежуточном этапе он расторизуется перед выводом. Но с характеристиками современных аппаратов, явой, веб-приложениями и прочим мне кажется это каплей в море. В самом начале оптимизация оправдывала себя, но, похоже, последние года 3 эту тему просто не затрагивали.

И интерфейс интерфейсу рознь, ведь есть великий и могучий. Qt. Но для всей системы это не выход, хотя для конкретного приложения сэкономит пару минут работы дизайнера/программиста.
А есть набор этих иконок в SVG? Где можно скачать?
Посмотрел, хороший сайт. В действительности, можно использовать его и тогда эта статья не имеет смысл, ну разве что предоставить ссылку на данный сайт.

Единственное что меня смутило — это
A minimal form of attribution would be to mention in your application's source project that some assets were created with the Android Asset Studio

А если я буду закрывать исходный код — буду ли я обязан в разделе «о программе» размещать ссылку на этот сайт?
Статья имеет смысл, если нужно сразу много иконок в определенных цветах. По поводу ссылки на Asset Studio я думаю это просто признак хорошего тона, вряд ли кто-то будет преследовать вас за то что вы ее не добавите.
Более правильный способ «красить иконки» в Android в Runtime:
  • Добавить в проект исходные иконки в белом цвете (можно даже nine patch с черными краями, но сами иконки должны быть белыми).
  • Далее:
    Drawable coloredDrawable = Utils.getColoredDrawable(browserIcon.getContext(), R.drawable.ic_browser_chrome, SOME_COLOR);
    browserIcon.setImageDrawable(coloredDrawable);
    

  • Где Utils.getColoredDrawable:
    public static Drawable getColoredDrawable(Context context, int whiteDrawableResId, int targetColor) {
      Drawable drawable = context.getResources().getDrawable(whiteDrawableResId);
      ColorFilter filter = new LightingColorFilter(targetColor, 0);
      drawable.mutate().setColorFilter(filter);
      return drawable;
    }
    

  • Вероятно, в версии Android <=2.1 вместо .mutate() придётся предварительно скопировать битмап в другую переменную прежде чем применять фильтр
    Bitmap mutableBitmap = immutableBitmap.copy(Bitmap.Config.ARGB_8888, true);
    

Сомнительно, что «более правильный способ» это красить иконки в рантайме, всё таки это время и ресурсы устройства. К тому же при верстке будет сложно, да и запаритесь вы каждую иконку сетить из кода.

Такой подход применим, если у вас есть разные темы в приложении и вы не хотите дублировать ресурсы для всех цветов, вот тогда да, конечно
Да и в этом случае стоит их кэшировать при первом обращении.
Я в рантайме красил, все летало даже на древнем HTC, на который Android собрали студенты (изначально Windows Mobile был) :D

Немного другой способ:

public static Bitmap colorize(final Bitmap image, final int color) {
Bitmap result = Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888);
Canvas cnv = new Canvas(result);
Paint pnt = new Paint();
pnt.setFilterBitmap(false);
cnv.drawColor(color);
pnt.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
cnv.drawBitmap(image, 0, 0, pnt);
return result;
}
Я вот так попробовал через Image Magick + bash — вроде тот же результат:

color="#593001"
out="/tmp/out"
find . -name '*.png' | while read path; do
  mkdir -p "$out/$(dirname "$path")"
  convert "$path" -fill "$color" +opaque '#000000' "png32:$out/$path"
done


Красит все иконки, найденные в текущей папке и её подпапках, воспроизводя
структуру папок в /tmp/out — с раскрашенными иконками. Можно записать
в одну строку (через ';').

Несложно доработать до полноценной утилиты (color="$1", out="$2" и т.д.)
Или как вариант можно сделать шрифт из svg.
Sign up to leave a comment.

Articles