2016-01-25 9 views
17

Добрый день, у меня есть изображение SVG. Как я могу добавить его в ImageView фон?Как использовать изображение SVG в ImageView

Я пытался использовать this library Но у меня есть проблема:

01-25 12:19:02.669 27719-27719/com.dvor.androidapp E/AndroidRuntime: FATAL EXCEPTION: main 
    android.view.InflateException: Binary XML file line #70: Error inflating class com.caverock.androidsvg.SVGImageView 
    at android.view.LayoutInflater.createView(LayoutInflater.java:626) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:761) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:498) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
    at com.dvor.mobileapp.checkout.ShoppingCart.onCreateView(ShoppingCart.java:411) 
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:953) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1499) 
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:456) 
    at android.os.Handler.handleCallback(Handler.java:730) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:176) 
    at android.app.ActivityThread.main(ActivityThread.java:5419) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:525) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
    at dalvik.system.NativeStart.main(Native Method) 
                      Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Constructor.constructNative(Native Method) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:600) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:498)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:398)  
    at com.dvor.mobileapp.checkout.ShoppingCart.onCreateView(ShoppingCart.java:411)  
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)  
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:953)  
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136)  
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)  
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1499)  
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:456)  
    at android.os.Handler.handleCallback(Handler.java:730)  
    at android.os.Handler.dispatchMessage(Handler.java:92)  
    at android.os.Looper.loop(Looper.java:176)  
    at android.app.ActivityThread.main(ActivityThread.java:5419)  
    at java.lang.reflect.Method.invokeNative(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:525)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)  
    at dalvik.system.NativeStart.main(Native Method)  
    Caused by: java.lang.NoClassDefFoundError: com.caverock.androidsvg.R$styleable 
    at com.caverock.androidsvg.SVGImageView.init(SVGImageView.java:80) 
    at com.caverock.androidsvg.SVGImageView.<init>(SVGImageView.java:66) 
    at java.lang.reflect.Constructor.constructNative(Native Method)  
    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)  
    at android.view.LayoutInflater.createView(LayoutInflater.java:600)  
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:498)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:398)  
    at com.dvor.mobileapp.checkout.ShoppingCart.onCreateView(ShoppingCart.java:411)  
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)  
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:953)  
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136)  
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)  
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1499)  
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:456)  
    at android.os.Handler.handleCallback(Handler.java:730)  
    at android.os.Handler.dispatchMessage(Handler.java:92)  
    at android.os.Looper.loop(Looper.java:176)  
    at android.app.ActivityThread.main(ActivityThread.java:5419)  
    at java.lang.reflect.Method.invokeNative(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:525)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)  
    at dalvik.system.NativeStart.main(Native Method) 

Что я сделал?

Во-первых, я добавил dependency к gradle:

compile 'com.caverock:androidsvg:1.2.1' 

Во-вторых, я изменил ImageView к com.caverock.androidsvg.SVGImageView

<com.caverock.androidsvg.SVGImageView 
     android:id="@+id/recentlyViewed_imgView" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     svgimageview:svg="clock.svg" 
     /> 

После этого я добавил xmls:svgimageview укоренить раскладку:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:svgimageview="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/rowItem" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#272727" 
    android:clickable="true" 
    android:orientation="vertical"> 

Этот clock.svg находится в папке assets.

+1

«Но у меня проблема» - задавая вопросы о переполнении стека, предоставьте всю трассировку стека. – CommonsWare

+0

https://developer.android.com/studio/write/vector-asset-studio.html#svg –

ответ

45

В новой Android Studio есть возможность импортировать SVG в файл XML, поэтому Вам не нужно использовать внешнюю библиотеку.

В доступном правом щелчке -> Новый -> Векторный объект -> локальный файл SVG.

enter image description here

Затем Вы можете использовать его, как правило, как и другой вводимый коэффициент:

android:src="@drawable/btn_image" 
+2

В случае использования библиотеки поддержки добавьте 'app: srcCompat =" @ drawable/btn_image "' – lomza

+2

Поддержка расширенного SVG функции, кажется, довольно слабы. –

+0

Это хорошая идея, но она не отвечает на вопрос. Векторный векторный формат Android * ужасный * для всех, кроме простейших изображений. SVG из общих инструментов графического дизайна плохо конвертируются, и Studio/Android даже не очень хорошо справляется с размером изображения. – spaaarky21

1

На новых устройствах, которые по умолчанию включены аппаратное рендеринг, необходимо явно включить рендеринг программного обеспечения.

imgView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

ИЛИ добавить этот тег в вашем XML

android:layerType="software" 
1

Чтобы правильно использовать атрибут svgimageview:svg, приложение должно знать, что это определение. К сожалению, на данный момент существует только версия JAR библиотеки, и (в отличие от AAR) необходимое определение не сливается должным образом при создании приложения.

Попробуйте скопировать файл attrs.xml из источника

https://github.com/BigBadaboom/androidsvg/blob/master/androidsvg/src/main/res/values/attrs.xml

библиотеки в папку res/values.

Я считаю, что это должно решить вашу проблему.