Android: самый простой способ установки полупрозрачного цвета неактивным иконкам

196
31 мая 2017, 03:43

Рассматривается задача установки полупрозрачного цвета неактивным иконкам на табах (по гайдлайнам иконки должны быть прозрачными на 30%).

Первый вариант решения данной задачи - использование <selector> в отдельном xml-файле:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/testicon_select" android:state_selected="true"/>
<item android:drawable="@drawable/testicon" />

Я так понял, что такой отдельный xml-файл должен быть для каждого таба, итого по 3 файла на таб:

  1. основная иконка
  2. полупрозрачная иконка
  3. селектор

Не глупо ли? Я считаю, что такое решение неприемлемо в 21 веке.

Представленное ниже программное решение работает.

protected void initMainViewTabs(){
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
    ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
    setupViewPager(viewPager);
    tabLayout.setupWithViewPager(viewPager);
    tabLayout.getTabAt(0).setIcon(R.drawable.ic_menu_tabOne);
    tabLayout.getTabAt(1).setIcon(R.drawable.ic_menu_tabTwo);
    tabLayout.getTabAt(2).setIcon(R.drawable.ic_menu_tabThree);
    tabLayout.getTabAt(3).setIcon(R.drawable.ic_menu_tabFour);
    tabLayout.getTabAt(1).getIcon().setAlpha(179);
    tabLayout.getTabAt(2).getIcon().setAlpha(179);
    tabLayout.getTabAt(3).getIcon().setAlpha(179);
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            tab.getIcon().setAlpha(255);
        }
        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            tab.getIcon().setAlpha(179);
        }
        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });
}

Можно ли сделать его ещё лаконичнее? На данный момент, в нём много хардкода, но вероятно, на пока нет средств его сократить. Кроме того - как такое решение с точки зрения производительности?

Answer 1

Множества промежуточных xml файлов можно избежать путем вложенностей:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
    <shape>
        <solid android:color="@color/cerulean_pressed" />
        <corners android:radius="4dp" />
        <padding android:right="16dp"
            android:left="16dp"/>
    </shape>
</item>
...
<item>
    <shape>
        <solid android:color="@color/cerulean" />
        <corners android:radius="4dp" />
        <padding android:right="16dp"
            android:left="16dp"/>
    </shape>
</item>
</selector>

Затем продумав дизайн можно описать стили и объединить их в темы. Если правильно подойти к этому этапу, то в следующий раз Вы просто скопируете шаблоны в папку drawable и в одном месте поменяете цвета (при условии, конечно, что в обеих случаях нет серьёзных кастомизаций и отклонений от рекомендованого варианта от Google). Скорость работы с таким подходом точно выше сравнительно с Java-методами.

Так как основная часть UI является статической (фон, шрифты, текстовые атрибуты, иконки и т.д.), а все варианты динамики должны быть предусмотрены, они все описываются в xml и такие файлы используются как ресурсы, которые нигде не пересекаются с логикой.

Использовать в этих целях Java, скорее всего, правильно когда пользователь очень сильно углубляется в изменения дизайна приложения и может все тонко настраивать, но даже в таком случае такие настройки придется хранить (и как вариант в том же самом xml).

READ ALSO
Вызвать функции из dll

Вызвать функции из dll

Можно ли из java кода вызвать готовые функции из dll, написанного на C++, а не писать dll изначально под java?

227
Как добавить флаг в JVM?

Как добавить флаг в JVM?

Добрый день, работаю с сервером на java в документации к нему говориться что следует для его запуска добавить в jvm флаг, дословно

240
Считывание с файла и вывод вдругой

Считывание с файла и вывод вдругой

есть файл, с него надо найти и считать два рядочка, по 3 числа в каждомэтих рядочков может быть много

222
архитектура service и controller spring

архитектура service и controller spring

Наставьте на путь истинный, что и где должно быть реализовано для взаимодействия контроллера и сервисаСигнатуры методов нивелированы!

241