¿Cómo usar vectores arrastrables en Android API inferior a 21?


Answers

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 representa 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 Drawwables vector también son compatibles en casos como la propiedad drawableLeft de TextView.

Fuente: anuncio de la biblioteca

Sin embargo, aún recomendaría algo así como la biblioteca de Iconics , AndroidSVG u otro icono de fuente o solución SVG para soporte completo de SVG y soporte.

Question

Estoy trabajando en un proyecto de Android y elegí <vector> para mostrar el icono porque es adaptable y dinámico, 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 la versión inferior de Android, es decir, API 14 o algo así. ¡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>`



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 para dibujar izquierda como este ..

editText.setCompoundDrawables( tick_drawable , null, null, null );



Solo para completar la respuesta de @ 2Dee:

VectorDrawable no se puede usar en API 20 y menor. El método oficial genera pngs, que luego se convierten en BitmapDrawables, lo que rompe la idea de gráficos vectoriales.

Personalmente prefiero svg 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 compilaciones más rápidas

Para usar gráficos vectoriales, puede probar https://github.com/BigBadaboom/androidsvg . Es un lector de svg y ImageView compatible con svg.




Cuando necesite agregar SVG-image programáticamente, puede hacerlo así:

icon = VectorDrawableCompat.create(resources, R.drawable.ic_map_black_24dp, null)



¡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 inflating".

Podemos crear envoltura ic_add_wrapped.xml 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 PARA TRABAJAR. Entonces lo usa bajo su propio riesgo.