Pull to refresh

Comments 35

А можно взять 9-path и его как-то обработать с помощью shape? Ну там скруглить края например и т.д?
Извините, конечно же 9-patch
Хм, в поле backround класса View может содержаться или цвет(solid color), или форма(shape), или 9-patch или statelist или еще что нибудь, но только одно.
Не могу придумать ситуацию с совместным применением. Ничего же не мешает округлить углы прямо на изображении *.png.
Но тем не менее если уж очень надо — можно поместить их друг на другом используя вложенные контейнеры и применяя к ним различные типы фона.
Нет, ну я имел в виду может быть можно выплюнуть на канву для shape 9-patch, а потом скруглить края, используя некие методы для shape? Или тут какая-то загвоздка?
Все еще не могу представить зачем может понадобиться обрабатывать таким образом изображение, но думаю если отрисовывать nine-patch на канву, то можно использовать тот же класс Paint для задания способа отрисовки. (метод draw)
Но я такое не пробовал и не вижу причин пока.
Эмм… Я как понимаю, есть у нас некий ShapeDrawable — его мы можем засунуть в качестве фона для произвольного View. Если так, то можно ли скруглить края у корнеров, используя соответствующие радиусы, причем заранее залив на канву в onDraw(Canvas canvas) некую имагу?

Лично мне это вообще в общем случае интересно, не только с 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.
Ну это уже был сарказм, к тому что вы решили проверить PaintDrawable)

Если серьезно, то есть еще момент — как после скругления PaintDrawable себя поведет система. То есть непонятно будет ли она рендерить 9-patch как обычно когда он будет неявно присутствовать на канве View, или она реагирует только на 9-patch, который в явном виде устанавливается как фоном. В общем и целом тут, видимо, нужно экспериментировать.
Этого можно легко добиться стандартными средствами оформления, я делал так: рисуем рамку с нужным округлением, задаём границы растяжения, ставим в качестве background, а затем с помощью padding указываем размеры тени, чтобы вся тень была видима.

image
Ещё как есть, всё ещё используется. Только более извращёнными способами.
Получается я могу, используя 9-patch, сделать резиновый фон для табов в TabWidget?

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

Вот фотоотчёт:


P.S. долго не мог понять кривого растяжения фона, пока не перечитал статью и не дошел до момента, что расширение надо делать *.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… Её убрали полностью или переместили куда-то?
Only those users with full accounts are able to leave comments. Log in, please.