it-swarm.com.ru

Как использовать векторные элементы рисования в 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>`
57
iamatsundere181

Vector Drawables теперь обратно совместимы, достаточно просто обновить версию Gradle до версии 1.4.0-beta3 или выше и обновить IDE:

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

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

25
2Dee

С библиотекой поддержки 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.

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

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

75
Alen Siljak

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

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

VectorDrawable cheatsheet

71
David Ferrand

Я нашел решение! Для тех, кто ищет решение с помощью 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". ПРЕДУПРЕЖДЕНИЕ! ЭТО IS ВРЕМЕННОЕ РЕШЕНИЕ. Таким образом, вы используете его на свой страх и риск.

38
Yazon2006

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

проверьте свой 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 в StateListDrawable xml-s или других xml-чертежах, вы должны генерировать их программно.
  • вы не можете использовать svg-s в случае уведомлений.
20
mehrdad khosravi

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

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

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

Поэтому вместо @color/primaryColorDark вы должны использовать реальный цвет, например #212121

4
Mark O'Sullivan

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

  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);
    
3
Kavya Shravan

Если вы используете Android Studio 3.0.0, вы можете установить

Android.enableAapt2=false 

в gradle.properties

https://www.reddit.com/r/androiddev/comments/6mj8di/Android_studio_30_canary_6_released/

2
Patrick Henderson

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

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

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

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

Чтобы использовать векторную графику, вы можете попробовать https://github.com/BigBadaboom/androidsvg . Это svg reader и svg-совместимый ImageView.

2
Zielony

Вы можете использовать программно .. чтобы установить 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 );
2
Santanu Sur

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

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

 textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie, 0, 0, 0);
0
Afjalur Rahman Rana