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

标签 android android-tablayout android-tabs android-vectordrawable android-selector

选项卡图标:我目前的方法是创建两个文件(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>

它有点重复,因为两个可绘制对象是相同的。

选择器不能用于矢量绘图。

<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>

--

// @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>

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>

有没有办法使用一个可绘制对象并动态改变它的颜色? 使用硬十六进制代码更好?

谢谢。

最佳答案

这是在 TabItem(它是支持设计库的一部分)中使用矢量资源作为有色图标的完整步骤列表。所有部分都出现在原始问题和链接的答案中,但很容易遗漏。

  1. 创建选择器。请注意,它必须切换 state_selected 的颜色(包含在问题中,但不包含在@cmingmai 链接的答案中。它只说明 android:state_enabled 与选项卡无关):

res/color/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>
  1. 通过将 android:tintModeandroid:tint 添加到矢量标签来调整矢量可绘制对象。 除了使用 multiply 进行着色之外,还需要将路径的 fillColor 设置为 white!

res/drawable/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>
  1. 在布局中使用矢量可绘制对象 – 或使用代码创建选项卡,如 developer guide on Tabs 中所示.请注意,我还修改了选项卡指示器颜色以匹配 Activity 图标颜色以遵循 material design guidelines。 .

布局的相关部分:

<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>
  1. 使用以下方法调整 build.gradle 以激活对旧 Android 版本的矢量支持(以防之前尚未添加):

    安卓{ 默认配置{ vectorDrawables.useSupportLibrary = true }

关于Android:如何在一个 Vector Drawable xml 中使用选择器更改 android:fillcolor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43847170/

相关文章:

android - 如何通过 BLE(蓝牙低功耗)将 Android 设备连接到 iOS 设备

android - 检测新的 Android 通知

android - 从按钮数组修改按钮

android - TabLayout设置ViewPager时出现空指针异常

android - 如何在 ViewPager 中刷新 fragment

android - ViewPager - 从 setOnTabSelectedListener 启动 Activity

android - 如何隐藏平板电脑底栏

java - 过滤列表后单击ListView Item

android - 布局中定义的 TabHost 在 setContent 期间给出 NullPointerException