47

プログラムで Android のベクター ファイルの塗りつぶしの色を編集したいと考えています。

xml ファイルでは、属性 android:fillColorを使用して色を設定できますが、実行時に色を変更したいと考えています。

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

4

7 に答える 7

50

これはまさにあなたが必要とするものです。投稿の著者である@emaguyの功績。サポート ライブラリ 23.4+の完全なサポートを追加しました。これにより、実行時に png の生成を停止できます。

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

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

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

SVG は、TextView や ToggleButton などの 、 などのsrcCompat他の属性とともに使用するだけでなく、使用することもできます。セレクターで使用した場合にも機能します。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);

それでおしまい!色を変更したい場合は、別のテーマを設定するだけで、ドローアブルが更新されます。完全なサンプルについては、GitHub リポジトリを参照してください

于 2016-07-17T04:59:33.017 に答える
24

全体の色を変更したい場合は、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 クラスを拡張します。ドキュメントを見る

于 2015-10-14T13:51:53.160 に答える