Change fill color on vector asset in Android Studio

后端 未结 12 1886
盖世英雄少女心
盖世英雄少女心 2020-12-02 04:09

Android Studio now supports vector assets on 21+ and will generate pngs for lower versions at compile time. I have a vector asset (from the Material Icons) that I want to c

相关标签:
12条回答
  • 2020-12-02 05:01

    if you look to support old version pre lolipop

    use the same xml code with some changes

    instead of normal ImageView --> AppCompatImageView

    instead of android:src --> app:srcCompat

    here is example

    <android.support.v7.widget.AppCompatImageView
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:id="@+id/button"
            app:srcCompat="@drawable/ic_more_vert_24dp"
            android:tint="@color/primary" />
    

    dont forget update your gradle as @ Sayooj Valsan mention

    // Gradle Plugin 2.0+  
     android {  
       defaultConfig {  
         vectorDrawables.useSupportLibrary = true  
       }  
     }  
    
     compile 'com.android.support:design:23.4.0'
    

    Notice To any one use vector dont ever ever never give your vector reference to color like this one android:fillColor="@color/primary" give its hex value .

    0 讨论(0)
  • 2020-12-02 05:03

    Don't edit the vector assets directly. If you're using a vector drawable in an ImageButton, just choose your color in android:tint.

    <ImageButton
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:id="@+id/button"
            android:src="@drawable/ic_more_vert_24dp"
            android:tint="@color/primary" />
    
    0 讨论(0)
  • 2020-12-02 05:08

    To change vector image color you can directly use android:tint="@color/colorAccent"

    <ImageView
            android:id="@+id/ivVectorImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_account_circle_black_24dp"
            android:tint="@color/colorAccent" />
    

    To change color programatically

    ImageView ivVectorImage = (ImageView) findViewById(R.id.ivVectorImage);
    ivVectorImage.setColorFilter(getResources().getColor(R.color.colorPrimary));
    
    0 讨论(0)
  • 2020-12-02 05:10

    You can do it.

    BUT you cannot use @color references for colors (..lame), otherwise it will work only for L+

    <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="#FFAABB"
        android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zm-6,0C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
    

    0 讨论(0)
  • 2020-12-02 05:10

    As said in other answers, don't edit the vector drawable directly, instead you can tint in java code, like that:

        mWrappedDrawable = mDrawable.mutate();
        mWrappedDrawable = DrawableCompat.wrap(mWrappedDrawable);
        DrawableCompat.setTint(mWrappedDrawable, mColor);
        DrawableCompat.setTintMode(mWrappedDrawable, PorterDuff.Mode.SRC_IN);
    

    And for the sake of simplicity, I have created a helper class:

    import android.content.Context;
    import android.graphics.PorterDuff;
    import android.graphics.drawable.Drawable;
    import android.os.Build;
    import android.support.annotation.ColorRes;
    import android.support.annotation.DrawableRes;
    import android.support.annotation.NonNull;
    import android.support.v4.content.ContextCompat;
    import android.support.v4.graphics.drawable.DrawableCompat;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.ImageView;
    
    /**
     * {@link Drawable} helper class.
     *
     * @author Filipe Bezerra
     * @version 18/01/2016
     * @since 18/01/2016
     */
    public class DrawableHelper {
        @NonNull Context mContext;
        @ColorRes private int mColor;
        private Drawable mDrawable;
        private Drawable mWrappedDrawable;
    
        public DrawableHelper(@NonNull Context context) {
            mContext = context;
        }
    
        public static DrawableHelper withContext(@NonNull Context context) {
            return new DrawableHelper(context);
        }
    
        public DrawableHelper withDrawable(@DrawableRes int drawableRes) {
            mDrawable = ContextCompat.getDrawable(mContext, drawableRes);
            return this;
        }
    
        public DrawableHelper withDrawable(@NonNull Drawable drawable) {
            mDrawable = drawable;
            return this;
        }
    
        public DrawableHelper withColor(@ColorRes int colorRes) {
            mColor = ContextCompat.getColor(mContext, colorRes);
            return this;
        }
    
        public DrawableHelper tint() {
            if (mDrawable == null) {
                throw new NullPointerException("É preciso informar o recurso drawable pelo método withDrawable()");
            }
    
            if (mColor == 0) {
                throw new IllegalStateException("É necessário informar a cor a ser definida pelo método withColor()");
            }
    
            mWrappedDrawable = mDrawable.mutate();
            mWrappedDrawable = DrawableCompat.wrap(mWrappedDrawable);
            DrawableCompat.setTint(mWrappedDrawable, mColor);
            DrawableCompat.setTintMode(mWrappedDrawable, PorterDuff.Mode.SRC_IN);
    
            return this;
        }
    
        @SuppressWarnings("deprecation")
        public void applyToBackground(@NonNull View view) {
            if (mWrappedDrawable == null) {
                throw new NullPointerException("É preciso chamar o método tint()");
            }
    
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                view.setBackground(mWrappedDrawable);
            } else {
                view.setBackgroundDrawable(mWrappedDrawable);
            }
        }
    
        public void applyTo(@NonNull ImageView imageView) {
            if (mWrappedDrawable == null) {
                throw new NullPointerException("É preciso chamar o método tint()");
            }
    
            imageView.setImageDrawable(mWrappedDrawable);
        }
    
        public void applyTo(@NonNull MenuItem menuItem) {
            if (mWrappedDrawable == null) {
                throw new NullPointerException("É preciso chamar o método tint()");
            }
    
            menuItem.setIcon(mWrappedDrawable);
        }
    
        public Drawable get() {
            if (mWrappedDrawable == null) {
                throw new NullPointerException("É preciso chamar o método tint()");
            }
    
            return mWrappedDrawable;
        }
    }
    

    To use just do the following:

        DrawableHelper
                .withContext(this)
                .withColor(R.color.white)
                .withDrawable(R.drawable.ic_search_24dp)
                .tint()
                .applyTo(mSearchItem);
    

    Or:

        final Drawable drawable = DrawableHelper
                .withContext(this)
                .withColor(R.color.white)
                .withDrawable(R.drawable.ic_search_24dp)
                .tint()
                .get();
    
        actionBar.setHomeAsUpIndicator(drawable);
    
    0 讨论(0)
  • 2020-12-02 05:10

    For those not using an ImageView, the following worked for me on a plain View (and hence the behaviour should replicate on any kind of view)

    <View
        android:background="@drawable/ic_reset"
        android:backgroundTint="@color/colorLightText" />
    
    0 讨论(0)
提交回复
热议问题