Comments 35
А можно взять 9-path и его как-то обработать с помощью shape? Ну там скруглить края например и т.д?
Извините, конечно же 9-patch
Хм, в поле backround класса View может содержаться или цвет(solid color), или форма(shape), или 9-patch или statelist или еще что нибудь, но только одно.
Не могу придумать ситуацию с совместным применением. Ничего же не мешает округлить углы прямо на изображении *.png.
Но тем не менее если уж очень надо — можно поместить их друг на другом используя вложенные контейнеры и применяя к ним различные типы фона.
Не могу придумать ситуацию с совместным применением. Ничего же не мешает округлить углы прямо на изображении *.png.
Но тем не менее если уж очень надо — можно поместить их друг на другом используя вложенные контейнеры и применяя к ним различные типы фона.
Нет, ну я имел в виду может быть можно выплюнуть на канву для shape 9-patch, а потом скруглить края, используя некие методы для shape? Или тут какая-то загвоздка?
Все еще не могу представить зачем может понадобиться обрабатывать таким образом изображение, но думаю если отрисовывать nine-patch на канву, то можно использовать тот же класс Paint для задания способа отрисовки. (метод draw)
Но я такое не пробовал и не вижу причин пока.
Но я такое не пробовал и не вижу причин пока.
Эмм… Я как понимаю, есть у нас некий ShapeDrawable — его мы можем засунуть в качестве фона для произвольного View. Если так, то можно ли скруглить края у корнеров, используя соответствующие радиусы, причем заранее залив на канву в onDraw(Canvas canvas) некую имагу?
Лично мне это вообще в общем случае интересно, не только с 9-patch. Написав один некий Shape вы можете скругливать произвольные имаги только при помощи кода, внутри самого приложения.
Что правда не интересно? Вообще работа с пэйнтом не очень прельщает, порадовало бы прямое выставление размеров радиусов для корнеров…
Лично мне это вообще в общем случае интересно, не только с 9-patch. Написав один некий Shape вы можете скругливать произвольные имаги только при помощи кода, внутри самого приложения.
Что правда не интересно? Вообще работа с пэйнтом не очень прельщает, порадовало бы прямое выставление размеров радиусов для корнеров…
Пробежавшись сейчас по докам пришел к выводу, что скорее всего это можно сделать методами канвы. Попробуйте. А даже если не удастся обрезать используя Shape — всегда можно вручную обрезать углы насколько вам надо, на канве то с этим проблем нет
Есть класс PaintDrawable, являющийся наследником ShapeDrawable, там есть явный метод setCornersRadii(float[] radii). Вопрос следующий — возможно ли ShapeDrawable сунуть в фон?
Извиняйте, можно ли PaintDrawable сунуть в фон?)
В фон View? Да, принимает, попробовал
Класс, значит таки можно выкрутиться с помощью PaintDrawable, спасибо за дискусс)
По идее в качестве бонуса, можно проверить — принимает ли Viewв фон любого произвольного наследника от Drawable) Есть мнение, что принимает)
Естественно принимает, тут и думать нечего :)
void setBackgroundDrawable(Drawable d)
Set the background to a given Drawable, or remove the background.
void setBackgroundDrawable(Drawable d)
Set the background to a given Drawable, or remove the background.
Ну это уже был сарказм, к тому что вы решили проверить PaintDrawable)
Если серьезно, то есть еще момент — как после скругления PaintDrawable себя поведет система. То есть непонятно будет ли она рендерить 9-patch как обычно когда он будет неявно присутствовать на канве View, или она реагирует только на 9-patch, который в явном виде устанавливается как фоном. В общем и целом тут, видимо, нужно экспериментировать.
Если серьезно, то есть еще момент — как после скругления PaintDrawable себя поведет система. То есть непонятно будет ли она рендерить 9-patch как обычно когда он будет неявно присутствовать на канве View, или она реагирует только на 9-patch, который в явном виде устанавливается как фоном. В общем и целом тут, видимо, нужно экспериментировать.
Андроминатор.
Жаль, что такого нет в вебе.
Есть нечто похожее в CSS3, но, конечно, это не универсальное решение, только для границ www.css3.info/preview/border-image/
Ещё как есть, всё ещё используется. Только более извращёнными способами.
Получается я могу, используя 9-patch, сделать резиновый фон для табов в TabWidget?


Резиновые фоны, резиновые контролы, резиновый интерфейс короче говоря — основное назначение 9-patch.
Да, только что попробовал. Можно для каждой вкладки
mTabHost.getTabWidget().getChildAt(0).setBackgroundDrawable(getResources().getDrawable(R.drawable.bg));
Применил 9-patch :)
Вот фотоотчёт:

P.S. долго не мог понять кривого растяжения фона, пока не перечитал статью и не дошел до момента, что расширение надо делать *.9.png :)
Вот фотоотчёт:

P.S. долго не мог понять кривого растяжения фона, пока не перечитал статью и не дошел до момента, что расширение надо делать *.9.png :)
Рад что статья кому-то помогла :)
И если не сложно поделитесь своими картинками табов и кодом установки :)
Конечно, не вопрос :)
9-patch картинки:

habreffect.ru/files/086/a54be4e77/nonseled.9.png

habreffect.ru/files/bcd/5563e8401/seled.9.png
private OnTabChangeListener MyOnTabChangeListener = new OnTabChangeListener()
{
@Override
public void onTabChanged(String tabId)
{
// Всем табам устанавливаем фон NonSeled (белый)
for(int i = 0; i < tabHost.getTabWidget().getChildCount(); i++)
{
tabHost.getTabWidget().
getChildAt(i).
setBackgroundDrawable(
getResources().
getDrawable(R.drawable.nonseled));
final TextView tv = (TextView)
tabHost.getTabWidget().
getChildAt(i).
findViewById(android.R.id.title);
tv.setTextColor(getResources().
getColorStateList(R.color.nonseledcolor));
}
// Выбранному табу ставим фон Seled (чёрный)
tabHost.getTabWidget().
getChildAt(tabHost.getCurrentTab()).
setBackgroundDrawable(
getResources().
getDrawable(R.drawable.seled));
final TextView tv = (TextView)
tabHost.getTabWidget().
getChildAt(tabHost.getCurrentTab()).
findViewById(android.R.id.title);
tv.setTextColor(getResources().
getColorStateList(R.color.seledcolor));
}
};
9-patch картинки:

habreffect.ru/files/086/a54be4e77/nonseled.9.png

habreffect.ru/files/bcd/5563e8401/seled.9.png
Спасибо за статью. Как вы считаете, в связке программист — дизайнер кто должен выполнять подготовку изображений 9patch? Или лучше, чтобы это был отдельный человек-верстальщик?
Спасибо, ваша статья только что сэкономила мне кучу времени :)
начиная с какой версии SDK это работает а то что то под 2.1 у меня просто подставляет ужасно подогнанное изображения с черными линиями а в 4 все нормально.
Не могу найти данную утилиту в папке sdk/tools… Её убрали полностью или переместили куда-то?
Sign up to leave a comment.
Android nine-patch — растягиваем андроида