Как использовать векторные чертежи в Android API ниже 21?

Я работаю над проектом Android, и я выбрал <vector> для отображения значка, потому что он адаптируется и динамически, однако я просто могу запустить это приложение на устройствах под управлением Android, у которых есть API 21 или выше. Мой вопрос в том, как я могу использовать <vector> для более низкой версии Android, то есть API 14 или своего рода. Спасибо!

<!-- 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>`

Ответ 1

Теперь векторные Drawables совместимы с обратной совместимостью, это просто вопрос модернизации версии gradle до версии 1.4.0-beta3 или выше и обновления вашей среды IDE:

Мы также рады предложить обратную совместимость для вашего вектора активы в Android Studio 1.4. Если у вас есть векторное изображение в формате ваш res/drawable, плагин gradle автоматически генерирует растровые изображения PNG для уровня API 20 и ниже во время сборки. Эта означает, что вам нужно обновлять и поддерживать свой векторный актив для вашего приложение и Android Studio могут позаботиться о преобразовании изображений процесс.

http://android-developers.blogspot.com.uy/2015/09/android-studio-14.html

Ответ 2

С библиотекой поддержки 23.2 истинная поддержка Vector Drawables была предоставлена вплоть до API v7. Рекомендуется отключить предыдущую версию поддержки, которая отображала PNG во время сборки, добавив

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

в файл build.gradle.

Реализация довольно проста. В Drawables появился новый атрибут srcCompat:

<ImageView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  app:srcCompat="@drawable/ic_add" />    <= this is new

Векторные Drawables также поддерживаются в таких случаях, как свойство TextView drawableLeft.

Источник: объявление библиотеки

Тем не менее, я бы порекомендовал что-то вроде библиотеки Iconics, AndroidSVG или другого значка со шрифтом или SVG-решения для полной поддержки SVG-standand.

Ответ 3

VectorDrawable поддерживаются pre-Lollipop через библиотеку поддержки, но способ их использования зависит от версии поддерживаемой библиотеки поддержки. И это может не работать во всех случаях.

Я сделал эту диаграмму, чтобы помочь (действителен для библиотеки поддержки 23.4.0 - не менее - 25.1.0).

VectorDrawable cheatsheet

Ответ 4

Я нашел решение! Для тех, кто ищет решение с помощью TextView и других атрибутов пространства имен "android". Прежде всего это необходимо:

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }

И в классе приложения определите это:

    @Override
    public void onCreate() {
        super.onCreate();
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

Теперь вы можете использовать app:srcCompat="@drawable/ic_add" но если вы попытаетесь использовать android:background= или android:drawableLeft= это приведет к падению приложения с исключением "Ошибка надувания".

Мы можем создать обернутый ic_add_wrapped.xml для этого вектора:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_add"/>
</layer-list>

И теперь он будет работать с любым свойством, например drawableLeft или background. Просто установите android:drawableLeft="@drawable/ic_add_wrapped.xml". ПРЕДУПРЕЖДЕНИЕ! ЭТО ВРЕМЕННОЕ РЕШЕНИЕ. Таким образом, вы используете его на свой страх и риск.

Ответ 5

вам нужно использовать репозиторий поддержки Android 30+, если вы используете студию Android и для поддержки Eclipse нужна поддержка библиотеки поддержки 23.4.1+.

проверьте build.gradle (проект), если используете версию 2.0+, добавьте код ниже в build.gradle (приложение)

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

и: если вы используете версию 1.5, добавьте ниже в свой build.gradle (приложение)

// Gradle Plugin 1.5  
 android {  
   defaultConfig {  
     generatedDensities = []  
  }  

  // This is handled for you by the 2.0+ Gradle Plugin  
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
 }  

вот пример кода для использования значка вектора:

<ImageView  
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  app:srcCompat="@drawable/ic_add"
  tools:ignore="MissingPrefix" />

или

<ImageButton
  android:layout_width="wrap_content"
  android:background="@android:color/transparent"
  app:srcCompat="@drawable/camera"
  tools:ignore="MissingPrefix"
  android:layout_height="wrap_content"/>

Векторные Drawables также поддерживаются в таких случаях, как свойство TextView drawableLeft. но он работал api 22+ для меня, и я до сих пор не знаю, как он будет работать для низкого api.

Также имейте в виду, если вы хотите быть совместимыми ниже API 21:

  • вы не можете использовать свойство android:background в функции xml или View.setBackgroundResource(). Вам нужно использовать View.setBackground().
  • вы не можете использовать svg-s в XML файлах StateListDrawable или других xml-чертежах, вам необходимо сгенерировать их программно.
  • Вы не можете использовать svg-s в случае уведомлений.

Ответ 6

Когда вам нужно добавить VectorDrawable (созданный из SVG) программно, вы можете сделать это следующим образом:

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

Ответ 7

У меня была проблема, когда мои векторные изображения появлялись, но были бы полностью черными, это было связано с проблемой, когда вы не можете ссылаться на цветные ресурсы в векторном XML файле.

Итак, вместо @color/primaryColorDark вам нужно использовать фактический цвет, например. #212121

Ответ 8

Для более низкой версии, совместимой,

  1. добавить ниже в Gradle,

    android {  
       defaultConfig {  
         vectorDrawables.useSupportLibrary = true  
        }  
     }
    
  2. добавьте приведенный ниже код в onCreate() в своем классе приложения,

    @Override
        public void onCreate() {
            super.onCreate();
            AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
        }
    
  3. В XML для 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"/>
    
  4. Если вы хотите изменить источник изображения программно, используйте это,

    imageView.setImageResource(R.drawable.ic_launcher);
    

Ответ 9

Просто чтобы ответить @2Dee:

VectorDrawable не может использоваться на API 20 и ниже. Официальный метод генерирует png, которые затем становятся BitmapDrawables, что ломает идею векторной графики.

Лично я предпочитаю svg над векторами xml:

  • такая графика может быть экспортирована прямо из Illustrator или другого популярного программного обеспечения.
  • svg поддерживает преобразования, текст, маски и другие вещи правильно
  • истинная масштабируемая векторная графика на всех платформах
  • меньший размер и более быстрая сборка

Для использования векторной графики вы можете попробовать https://github.com/BigBadaboom/androidsvg. Это svg-ридер и SVG-совместимый ImageView.

Ответ 11

Вы можете использовать программно.. чтобы установить drawableLeft для вашего editText или textView

лайк

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

И для рисования осталось вот так..

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

Ответ 12

после установки vectorDrawables.useSupportLibrary = true в gradle по умолчанию и AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); в деятельности по созданию

Чтобы избежать сбоев с android: drawableleft в Textview, установите drawble влево для textview программно, например:

 textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie, 0, 0, 0);

Ответ 13

После использования кода ниже.

android {
  defaultConfig {
  vectorDrawables.useSupportLibrary = true  
                }
        }




public class App extends Application {
static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}}

Тем не менее, существует проблема векторных изображений для следующих атрибутов:

DrawableEnd, DrawableStart, DrawableTop, DrawableBottom, Background

В этом случае, пожалуйста, следуйте указаниям ниже. Вместо ссылки на векторное изображение непосредственно используйте селекторный тег в качестве промежуточного нарисованного файла.

Пример:

ic_warranty_icon.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="17dp"
android:height="24dp"
android:autoMirrored="true"
android:viewportWidth="17"
android:viewportHeight="24">

<path
    android:fillColor="#fff"
    android:pathData="M10.927,15.589l-1.549,0.355a7.47,7.47 0,0 1,-0.878 0.056c-4.136,0 -7.5,-3.364 -7.5,-7.5s3.364,-7.5 7.5,-7.5 7.5,3.364 7.5,7.5c0,3.286 -2.126,6.078 -5.073,7.089zM8.5,2a6.508,6.508 0,0 0,-6.5 6.5c0,3.583 2.917,6.5 6.5,6.5s6.5,-2.917 6.5,-6.5 -2.917,-6.5 -6.5,-6.5z" />

safe_ic_warranty_icon.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_warranty_icon"  />
</selector>

Ваш TextView/Layout.

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:drawableStart="@drawable/ic_warranty_icon"
       />


<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_warranty_icon"
       />