java - usesupportlibrary - ¿Cómo usar los dibujos vectoriales en la API de Android 21 inferior?
vector drawable android gradle (12)
Estoy trabajando en un proyecto de Android y elegí
<vector>
para mostrar el icono porque es adaptable y dinámicamente, sin embargo, solo puedo ejecutar esta aplicación en dispositivos con Android, que tienen API 21 o superior.
Mi pregunta es cómo puedo usar
<vector>
en una versión inferior de Android, es decir, API 14 o más.
¡Gracias!
<!-- drawable/ic_android_debug_bridge.xmlxml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="48dp"
android:width="48dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/primaryColorDark"
android:pathData="M15,9A1,1 0 0,1 14,8A1,1 0 0,1 15,7A1,1 0 0,1 16,8A1,1 `0 0,1 15,9M9,9A1,1 0 0,1 8,8A1,1 0 0,1 9,7A1,1 0 0,1 10,8A1,1 0 0,1 9,9M16.12,4.37L18.22,2.27L17.4,1.44L15.09,3.75C14.16,3.28 13.11,3 12,3C10.88,3 9.84,3.28 8.91,3.75L6.6,1.44L5.78,2.27L7.88,4.37C6.14,5.64 5,7.68 5,10V11H19V10C19,7.68 17.86,5.64 16.12,4.37M5,16C5,19.86 8.13,23 12,23A7,7 0 0,0 19,16V12H5V16Z" /></vector>`
¡Encontré la solución! Para aquellos que buscan una solución con TextView y otros atributos de espacio de nombres "android". En primer lugar, esto es necesario:
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
Y en la clase de aplicación, defina esto:
@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
Ahora puede usar la
app:srcCompat="@drawable/ic_add"
pero si intenta usar
android:background=
o
android:drawableLeft=
se bloqueará la aplicación con la excepción "Error al inflar".
Podemos crear
ic_add_wrapped.xml
envuelto para este vector:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_add"/>
</layer-list>
Y ahora funcionará con cualquier propiedad como drawableLeft o background.
Simplemente configure
android:drawableLeft="@drawable/ic_add_wrapped.xml"
.
¡ADVERTENCIA!
Esta es una solución alternativa.
Entonces lo usa bajo su propio riesgo.
Con la biblioteca de soporte 23.2, el verdadero soporte para Vector Drawables se ha proporcionado hasta API v7. Se recomienda deshabilitar la versión anterior del soporte, que representaba PNG durante el tiempo de compilación, agregando
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
al archivo
build.gradle
.
La implementación es bastante simple. Hay un nuevo atributo srcCompat en Drawables:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add" /> <= this is new
Los Drawables vectoriales también son compatibles en casos como la propiedad drawableLeft de TextView.
Fuente: anuncio de la biblioteca
Sin embargo, todavía recomendaría algo como la biblioteca Iconics , AndroidSVG u otra fuente de icono o solución SVG para soporte y soporte SVG completo.
Cuando necesite agregar VectorDrawable (creado a partir de SVG) mediante programación, puede hacerlo así:
icon = VectorDrawableCompat.create(resources, R.drawable.ic_map_black_24dp, null)
Los Vector Drawables ahora son compatibles con versiones anteriores, solo es cuestión de actualizar su versión gradle a 1.4.0-beta3 o superior, y actualizar su IDE:
También nos complace ofrecer compatibilidad con versiones anteriores para sus activos vectoriales en Android Studio 1.4. Una vez que tenga una imagen vectorialDrawable en su resolución / dibujable, el complemento Gradle generará automáticamente imágenes PNG ráster para el nivel de API 20 o inferior durante el tiempo de compilación. Esto significa que solo necesita actualizar y mantener su activo vectorial para su proyecto de aplicación y Android Studio puede encargarse del proceso de conversión de imágenes.
http://android-developers.blogspot.com.uy/2015/09/android-studio-14.html
Para versiones inferiores compatibles,
-
agregue lo siguiente en gradle,
android { defaultConfig { vectorDrawables.useSupportLibrary = true } }
-
agregue el siguiente código en onCreate () en su clase de aplicación,
@Override public void onCreate() { super.onCreate(); AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }
-
En xml para imageView,
<ImageView android:id="@+id/imageViewMessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/transparent" app:srcCompat="@drawable/ic_success"/>
-
Si desea cambiar la fuente de la imagen mediante programación, use esto,
imageView.setImageResource(R.drawable.ic_launcher);
Puede usar programáticamente ... para establecer
editText
su
editText
o
textView
me gusta
Drawable tick_drawable = VectorDrawableCompat.create(getResources(), R.drawable.green_tick, null);
if (tick_drawable != null) {
tick_drawable.setBounds(0, 0, tick_drawable.getIntrinsicWidth(),tick_drawable.getIntrinsicHeight());
}
Y a la izquierda dibujable así ...
editText.setCompoundDrawables( tick_drawable , null, null, null );
Si está utilizando Android Studio 3.0.0, puede configurar
android.enableAapt2=false
en gradle.properties
https://www.reddit.com/r/androiddev/comments/6mj8di/android_studio_30_canary_6_released/
Solo para completar la respuesta de @ 2Dee:
VectorDrawable no se puede usar en API 20 y versiones inferiores. El método oficial genera pngs, que luego se convierten en BitmapDrawables, lo que rompe la idea de los gráficos vectoriales.
Personalmente prefiero svg''s sobre vectores xml:
- tales gráficos se pueden exportar directamente desde Illustrator u otro software popular
- svg admite transformaciones, texto, máscaras y otras cosas correctamente
- verdaderos gráficos vectoriales escalables en todas las plataformas
- tamaño más pequeño y construcciones más rápidas
Para usar gráficos vectoriales, puede probar AndroidSVG . Es un lector de svg e ImageView compatible con svg.
Tuve un problema en el que mis imágenes vectoriales aparecerían pero serían completamente negras, esto se debió a un problema en el que no puede hacer referencia a los recursos de color en el archivo xml del vector.
Entonces, en lugar de
@color/primaryColorDark
, debe usar el color real, por ejemplo,
#212121
después de configurar vectorDrawables.useSupportLibrary = true en gradle default y AppCompatDelegate.setCompatVectorFromResourcesEnabled (true); en actividad en crear
Para evitar bloquearse con Android: drawableleft en Textview , establezca drawble a la izquierda en la vista de texto programáticamente por ejemplo:
textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie, 0, 0, 0);
necesita usar Android Support Repository 30+ si usa android studio y necesita la biblioteca de soporte de Android 23.2.1+ si usa Eclipse.
verifique su
build.gradle
(proyecto) si usa la versión 2.0+ agregue el código siguiente en su
build.gradle
(aplicación)
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
y: si usa la versión 1.5, agregue a continuación en su
build.gradle
(aplicación)
// Gradle Plugin 1.5
android {
defaultConfig {
generatedDensities = []
}
// This is handled for you by the 2.0+ Gradle Plugin
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
Aquí hay un código de muestra para usar el icono de vector:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add"
tools:ignore="MissingPrefix" />
o
<ImageButton
android:layout_width="wrap_content"
android:background="@android:color/transparent"
app:srcCompat="@drawable/camera"
tools:ignore="MissingPrefix"
android:layout_height="wrap_content"/>
Los Drawables vectoriales también son compatibles en casos como la propiedad drawableLeft de TextView. pero funcionó api 22+ para mí y todavía no sé cómo funcionará para api baja.
También tenga en cuenta si desea ser compatible con API 21:
-
no puede usar la propiedad
android:background
en xml o la funciónView.setBackgroundResource()
. Necesita usarView.setBackground()
. - no puede usar los svg-s en StateListDrawable xml-s u otros dibujables xml, debe generarlos mediante programación.
- no puede usar svg-s en caso de notificaciones.
VectorDrawable se admite antes de Lollipop a través de la Biblioteca de soporte , pero la forma de usarlos depende de la versión de la Biblioteca de soporte que tenga. Y puede que no funcione en todos los casos.
He creado este diagrama para ayudar (válido para Support Library 23.4.0 a - al menos - 25.1.0).