studio practicas libros instalacion herramientas crear con basico avanzado aplicaciones android android-studio vector-graphics vectordrawable android-vectordrawable

practicas - manual android studio avanzado



Cambiar el color de relleno en el activo del vector en Android Studio (10)

Actualización: soporte de AppCompat

Otras respuestas sospechan que android:tint funcionará solo en más de 21 dispositivos, AppCompat ( v23.2.0 y superior ) ahora proporciona un manejo compatible con versiones anteriores del atributo tint.

Por lo tanto, el curso de acción sería utilizar AppCompatImageView y app:srcCompat (en el espacio de nombres de AppCompat) en lugar de android:src (espacio de nombres de Android).

Aquí hay un ejemplo:

<android.support.v7.widget.AppCompatImageView android:id="@+id/credits_material_icon" android:layout_width="20dp" android:layout_height="20dp" android:layout_marginBottom="8dp" android:layout_marginLeft="16dp" android:layout_marginStart="16dp" android:scaleType="fitCenter" android:tint="#ffd2ee" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:srcCompat="@drawable/ic_dollar_coin_stack" />

Y no olvide habilitar el soporte de dibujo vectorial en gradle:

vectorDrawables.useSupportLibrary = true

Android Studio ahora admite activos vectoriales en 21+ y generará pngs para versiones inferiores en tiempo de compilación. Tengo un activo vectorial (de los iconos de material) que quiero cambiar el color de relleno. Esto funciona en 21+, pero los png generados no cambian de color. ¿Hay alguna forma de hacer esto?

<vector android:height="48dp" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="@color/primary" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>


Actualmente la solución de trabajo es android: fillColor = "# FFFFFF"

Nada funcionó para mí excepto la codificación dura en el vector

<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24.0" android:fillColor="#FFFFFF" android:viewportHeight="24.0"> <path android:fillColor="#FFFFFF" 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"/>

Sin embargo, fillcolor y tint podrían funcionar pronto. Consulte esta discusión para obtener más información:

code.google.com/p/android/issues/detail?id=186431

Además, los colores pueden quedarse en la memoria caché, por lo que puede ser útil eliminar la aplicación para todos los usuarios.


Agregue esta biblioteca a Gradle para habilitar el vector de color dibujable en dispositivos Android antiguos.

compile ''com.android.support:palette-v7:26.0.0-alpha1''

y volver a sincronizar gradle. Creo que resolverá el problema.


Android studio ahora admite vectores pre-lollipop. Sin conversión PNG. Todavía puede cambiar su color de relleno y funcionará.

En su ImageView, use

app:srcCompat="@drawable/ic_more_vert_24dp"

En tu archivo gradle,

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


Como se dijo en otras respuestas, no edite el vector dibujable directamente, en su lugar, puede teñir el código java, así:

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

Y por simplicidad, he creado una clase auxiliar:

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

Para usar solo haga lo siguiente:

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

O:

final Drawable drawable = DrawableHelper .withContext(this) .withColor(R.color.white) .withDrawable(R.drawable.ic_search_24dp) .tint() .get(); actionBar.setHomeAsUpIndicator(drawable);


No edite los activos vectoriales directamente. Si está utilizando un vector dibujable en un ImageButton, simplemente elija su color en 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" />


Para cambiar el color de la imagen vectorial, puede usar directamente 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" />

Para cambiar el color programáticamente

ImageView ivVectorImage = (ImageView) findViewById(R.id.ivVectorImage); ivVectorImage.setColorFilter(getResources().getColor(R.color.colorPrimary));


Puedes hacerlo.

PERO no puede usar referencias de color para colores (..lame), de lo contrario funcionará solo para 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"/>


Si los vectores no muestran colores configurados individualmente usando fillColor, entonces pueden estar configurados en un parámetro de widget predeterminado.

Intente agregar la app:itemIconTint="@color/lime" a activity_main.xml para establecer un tipo de color predeterminado para los iconos del widget.

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <include layout="@layout/app_bar_main" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_main" app:itemIconTint="@color/lime" app:menu="@menu/activity_main_drawer" /> </android.support.v4.widget.DrawerLayout>

VectorDrawable @ developers.android


si buscas soportar la versión anterior pre lolipop

usa el mismo código xml con algunos cambios

en lugar de ImageView --> AppCompatImageView normal ImageView --> AppCompatImageView

en lugar de android:src --> app:srcCompat

aquí hay un ejemplo

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

no olvides actualizar tu gradle como @ Sayooj Valsan menciona

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

Aviso Para cualquiera que use el vector, nunca le dé su referencia de vector a un color como este android:fillColor="@color/primary" da su valor hexadecimal.