Вид снизу навигации - градиентный оттенок значка - PullRequest
0 голосов
/ 20 сентября 2018

Я изменил оттенок значка в BottomNavigationView, используя селектор и цвет градиента в качестве оттенка при нажатии значка, но вместо изменения оттенка значка на градиент Android сделал все мои иконки фиолетовыми.enter image description here Мой вопрос: есть ли возможность изменить оттенок значков в BottomNavigationView на цвет градиента?

BottomNavigationCode:

<com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_bottom_main"
        android:layout_width="match_parent"
        app:itemIconTint="@color/bottom_menu_background"
        android:layout_height="wrap_content"
        app:menu="@menu/bottom_navigation_main"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

bottom_menu_background:

 <?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:color="@color/button_gradient_blue" android:state_checked="true" />
     <item android:color="@color/baseGray"/>
 </selector>

button_gradient_blue:

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" >
        <shape android:shape="rectangle"  >
            <corners android:radius="@dimen/base_button_radius" />
            <gradient android:angle="0" android:startColor="@color/light_blue_gradient_start"
            android:endColor="@color/light_blue_gradient_end"  />
        </shape>
    </item>
    <item android:state_focused="true">
        <shape android:shape="rectangle"  >
            <corners android:radius="@dimen/base_button_radius" />
            <solid android:color="@color/button_pressed_color"/>
        </shape>
    </item>
    <item >
        <shape android:shape="rectangle"  >
            <corners android:radius="@dimen/base_button_radius" />
            <gradient android:angle="0" android:startColor="@color/light_blue_gradient_start"
            android:endColor="@color/light_blue_gradient_end" />
        </shape>
    </item>
</selector>

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Хорошо. Мне удалось сделать это с помощью двух разных элементов рисования, один с градиентным оттенком, а другой для невыбранных в меню навигации снизу.

Я создал пользовательское представление, расширяющее форму BottomNavigationView, и я создал собственный методдля создания меню:

fun initMenu(){
    itemIconTintList = null
    var firstStart = true
    setOnNavigationItemSelectedListener {
        val index = it.itemId
        firstStart = false
        menu.forEach {
            if (it.isChecked && !firstStart) {
                if (it.itemId == index)
                    return
                it.isChecked = false
                it.icon = ContextCompat
                    .getDrawable(context, UNSELECTED_MAP[it.itemId]!!)
        }

    }
    it.icon = ContextCompat.getDrawable(context, SELECTED_MAP[it.itemId]!!)

}

, где UNSELECTED_MAP и SELECTED MAP - это HashMaps с идентификатором меню элемента в качестве «ключа» и ресурсом для рисования в качестве «значения»

0 голосов
/ 08 ноября 2018

Более простой способ добиться этого, чем создание подкласса, состоит в создании двух отдельных элементов рисования, а затем создании селектора, который назначается в качестве значка для меню для нижнего навигационного представления.

activity.xml:

<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    app:itemIconTint="@drawable/sel_navigation"
    app:itemTextColor="@drawable/sel_navigation_label"
    app:menu="@menu/navigation" />

menu / navigation.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:id="@+id/navigation_history"
    android:icon="@drawable/ic_history_selector"
    android:title="@string/title_history" />
</menu>

drawable / ic_history_selector.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_history_selected" android:state_pressed="true" />
<item android:drawable="@drawable/ic_history_selected" android:state_checked="true"/>
<item android:drawable="@drawable/ic_history"/>
</selector>

drawable / ic_history.xml:

<vector ...>
<path android:fillColor="@color/gradient_orange" .../>
</vector>

цвет / градиент_orange.xml:

<gradient xmlns:android="http://schemas.android.com/apk/res/android"
android:angle="0"
android:endColor="@color/orange"
android:startColor="@color/lightOrange"
android:startX="0"
android:endX="0"
android:startY="0"
android:endY="100"
android:type="linear" />

Наконец, в упражнении вам нужно установить нулевой список оттенков значка, чтобы он не использовал цвет оттенка значка из xml.Отлично работает с градиентами (API 24 +).

См .: https://stackoverflow.com/a/47203888

0 голосов
/ 20 сентября 2018

Решение:

Прежде всего, используйте приведенное ниже BottomNavigationView

<android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    app:itemBackground="@color/White"
    app:itemIconTint="@color/bottom_color"
    app:itemTextColor="@color/bottom_color"
    app:menu="@menu/your_menu_layout"/>

, затем создайте папку с именем color (если выеще нет), затем создайте файл с именем bottom_color, затем используйте app:itemIconTint="@color/bottom_color" файл ниже:

bottom_color

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:color="@color/Black"
        android:state_checked="false"/>
    <item
        android:color="#1c5fab"
        android:state_checked="true"/>

</selector>

Вы можете придать любой цвет, какой захотитев android:state_checked="true"

Это из моего собственного проекта, который я использую.

Попробуйте.Надеюсь, это поможет.

...