web-dev-qa-db-ja.com

AndroidでプログラムでベクターのfillColorを変更する

Androidでベクトルファイルの塗りつぶし色を編集したい。

Xml-fileでは、属性Android:fillColorで色を設定できますが、実行時に色を変更したいです。

そのための例はありますか?ありがとう。

29
Sascha K.

これ はまさに必要なものです。投稿の著者である @ emmaguy へのクレジット。 Support Library 23.4 + の完全なサポートを追加しました。これにより、実行時にpngの生成を停止できます。

 // Gradle Plugin 2.0+  
 Android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
 } 

そして、この行がアクティビティまたはアプリケーションのonCreateに設定されている場合:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

SVGはsrcCompatだけでなく、TextView、ToggleButtonなどのdrawableLeftbackgroundなどの他の属性でも使用できます。セレクターで使用する場合にも機能します。

VectorDrawableCompat.createの代わりにResourcesCompat.getDrawableを使用するようにコードを変更しました。そうしないと、動作せず、org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag vectorがスローされます。


中程度の投稿コンテンツ:

まず、2種類の安物の宝石の属性を作成して、色を変更できるようにします。

<declare-styleable name="ChristmasTree">
    <attr name="bauble_round" format="color" />
    <attr name="bauble_small" format="color" />
</declare-styleable>

次に、VectorDrawableで、これらの属性を使用するために動的に変更するパーツを設定します。

<path
    Android:fillColor="?attr/bauble_round"
    Android:pathData="...." />
<path
    Android:fillColor="?attr/bauble_small"
    Android:pathData="...." />
...

テーマを作成し、使用する色を設定します。

<style name="UpdatedScene" parent="DefaultScene">
    <item name="bauble_round">#db486e</item>
    <item name="bauble_small">#22c7f7</item>
</style>

<style name="DefaultScene">
    <item name="bauble_round">#fec758</item>
    <item name="bauble_small">#f22424</item>
</style>

ImageViewでドロウアブルを使用します。

final ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.DefaultScene);
final Drawable drawable = VectorDrawableCompat.create(getResources(), R.drawable.christmas, wrapper.getTheme());
imageView.setImageDrawable(drawable);

それでおしまい!色を変更する場合は、別のテーマを設定するだけで、Drawableが更新されます。完全なサンプルについては、GitHub repo をご覧ください。

30
saiyancoder

色全体を変更する場合は、PorterduffColorFilterを適用できます。しかし、これは単一の<path>では機能しません。ドロアブル全体に対してのみ。

public void applyThemeToDrawable(Drawable image) {
    if (image != null) {
        PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.BLUE,
                PorterDuff.Mode.SRC_ATOP);

        image.setColorFilter(porterDuffColorFilter);
    }
}

VectorDrawableはDrawableクラスを拡張します。 ドキュメントを参照

16
AlbAtNf

setColorFilter()メソッドを画像コンテンツベクトルに追加します(APIレベル8で追加されます)。

imgshare = (Imageview) findviewbyId(R.id.imageshare);
imgshare.setColorFilter(color);
6
user6757534