Android:如何在一个Vector Drawable xml中使用选择器更改android:fillcolor

cmi*_*mai 7 android android-tabs android-selector android-tablayout android-vectordrawable

选项卡图标:我当前的方法是创建两个文件(ic_list_selected_24dp.xml和ic_list_unselected_24dp.xml;它们基本相同但只是android:fillColor='Color HEX CODE'不同),然后创建一个选择器(selector_tabitem_list.xml)来更改状态时的可绘制颜色改变了.

// @drawable/selector_tabitem_list.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:drawable="@drawable/ic_list_selected_24dp" 
        android:state_selected="true" />
    <item android:drawable="@drawable/ic_list_unselected_24dp" 
        android:state_selected="false" />
</selector>
Run Code Online (Sandbox Code Playgroud)

它有点复制,因为两个drawable是相同的.

选择器不能用于矢量drawable.

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="@drawable/selector"
        android:pathData="M19,3...."
</vector>
Run Code Online (Sandbox Code Playgroud)

-

// @drawable/selector

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true">
        <color android:color="@color/itemSelected" />
    </item>
    <item android:state_selected="false">
        <color android:color="@color/itemUnselected" />
    </item>
</selector>
Run Code Online (Sandbox Code Playgroud)

,android:fillColor="@color/state"或者.

// @color/state

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/white" android:state_selected="true" />
    <item android:color="@android:color/black" android:state_selected="false" />
</selector>
Run Code Online (Sandbox Code Playgroud)

有没有办法使用一个drawable并动态更改其颜色?使用硬十六进制代码更好?

谢谢.

sun*_*rer 11

以下是使用矢量资产作为TabItem(它是支持设计库的一部分)中的有色图标的完整步骤列表.所有部分都存在于原始问题和相关答案中,但很容易被遗漏.

  1. 创建选择器.请注意,它必须切换颜色state_selected(包括在问题中,但不在@cmingmai链接的答案中.在那里它只表示android:state_enabled与标签无关):

RES /颜色/ selector_navigation.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="false" android:color="@android:color/black" />
    <item android:state_selected="true" android:color="@android:color/white" />
</selector>
Run Code Online (Sandbox Code Playgroud)
  1. 通过添加android:tintModeandroid:tint向量标签调整矢量drawable .此外,为了使用multiply进行着色,路径的fillColor需要设置为白色!

RES /绘制/ ic_tab_list:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:height="24dp"
        android:width="24dp"
        android:viewportHeight="24.0"
        android:viewportWidth="24.0"
        android:tintMode="multiply"
        android:tint="@color/selector_navigation">
    <path
        android:fillColor="@android:color/white"
        android:pathData="..." />
</vector>
Run Code Online (Sandbox Code Playgroud)
  1. 在布局中使用矢量drawable - 或者用于在代码中创建选项卡,如选项卡上的开发人员指南中所示.请注意,我还修改了选项卡指示器颜色以匹配活动图标颜色,以遵循材料设计准则.

布局的相关部分:

<android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabIndicatorColor="@android:color/white">

    <android.support.design.widget.TabItem
        android:id="@+id/tabItem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:icon="@drawable/ic_tab_list" />
    <!-- More Tabs -->
</android.support.design.widget.TabLayout>
Run Code Online (Sandbox Code Playgroud)
  1. 使用以下方法调整build.gradle以激活旧版Android的矢量支持(如果之前尚未添加):

    android {defaultConfig {vectorDrawables.useSupportLibrary = true}}