web-dev-qa-db-ja.com

Drawable Resourcexml内のVectorDrawableの色合い

次のような選択可能なButton/ImageViewの描画可能なリソースがあります。

<selector>
<item Android:state_selected="true">
    <layer-list>
        <item>
            <shape Android:shape="oval">
                <solid Android:color="@color/blue"/>
            </shape>
        </item>
        <item>
            <bitmap
                Android:src="@drawable/ic_icon"
                Android:tint="@color/white"/>

        </item>
    </layer-list>
</item>
<item>
    <layer-list>
        <item>
            <shape Android:shape="oval">
                <solid Android:color="@color/background_unselected"/>
            </shape>
        </item>
        <item>
            <bitmap
                Android:src="@drawable/ic_icon"
                Android:tint="@color/icon_unselected"/>
        </item>
    </layer-list>
</item>

vectorDrawablesを使用するように切り替えたため、<bitmap>タグでVectorDrawableを参照できないため、上記の宣言は機能しません。しかし、私が知る限り、それがアイコンに色を付ける唯一の方法です。

また、コードにカラーフィルターを適用することはできません。これは、アイコンだけでなく、ドローアブル全体に色を付けるためです。

助言がありますか?

9
cwiesner

色を属性として定義し、SVGでそれらを参照できます。次に、テーマによってスタイル設定されたドローアブルをロードできます。

短い例:

attributes.xml

<declare-styleable name="vectorColors">
    <attr name="primaryColor" format="color" />
    <attr name="secondaryColor" format="color" />
</declare-styleable>

ic_icon.xml

<path
    Android:fillColor="?attr/primaryColor"
    Android:pathData="...." />
<path
    Android:fillColor="?attr/secondaryColor"
    Android:pathData="...." />

styles.xml

<style name="svgColors">
    <item name="primaryColor">@color/someColor</item> 
    <!-- also can use #RRGGBB way -->
    <item name="secondaryColor">#ff0000</item>
</style>

次に、テーマとドローアブルをロードします。

Resources.Theme theme = getResources().newTheme();
theme.applyStyle(R.style.svgColors, false);
VectorDrawableCompat drawable = VectorDrawableCompat.create(getResources(), R.drawable.ic_icon, theme);
imageView.setImageDrawable(drawable);

特定のセレクターで置き換える必要があります

<item>
    <bitmap
        Android:src="@drawable/ic_icon"
        Android:tint="@color/white"/>
</item>

沿って <item Android:drawable="@drawable/ic_icon">

参照と完全な例

3
Leo2705