2016-01-25 13 views
17

Buon giorno, ho un'immagine SVG. Come posso aggiungerlo allo sfondo ImageView?Come utilizzare l'immagine SVG in ImageView

ho provato ad usare this library Ma ho problema:

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) 

Che cosa ho fatto?

Innanzitutto, ho aggiunto dependency a gradle:

compile 'com.caverock:androidsvg:1.2.1' 

secondo luogo, ho cambiato ImageView a 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" 
     /> 

Dopo che ho aggiunto xmls:svgimageview per sradicare la layout:

<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"> 

Questo clock.svg si trova nella cartella assets.

+1

"Ma ho un problema": quando si fanno domande su Stack Overflow, si prega di fornire l'intera traccia dello stack. – CommonsWare

+0

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

risposta

45

Nel nuovo studio Android v'è la possibilità di importare SVG in un file XML, in modo da non avete bisogno di utilizzare librerie esterne.

In disegnabile, fare clic con il tasto destro del mouse -> Nuovo -> Asset vettoriale -> File SVG locale.

enter image description here

quindi si utilizza normalmente come gli altri drawable:

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

In caso di utilizzo della libreria di supporto, aggiungere 'app: srcCompat =" @ drawable/btn_image "' – lomza

+2

Supporto per SVG avanzato le caratteristiche sembrano essere piuttosto deboli, però. –

+0

È una buona idea ma non risponde alla domanda. Il formato vettoriale disegnato da Android è * terribile * per tutti tranne le immagini più semplici. Gli SVG di strumenti di progettazione grafica comuni non si convertono bene e Studio/Android non fa nemmeno un ottimo lavoro nel rispetto delle dimensioni dell'immagine. – spaaarky21

1

Sui dispositivi più recenti con il rendering dell'hardware attivato per impostazione predefinita, è necessario attivare esplicitamente il rendering del software.

imgView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

O aggiungere questo tag nel xml

android:layerType="software" 
1

Per utilizzare correttamente l'attributo svgimageview:svg, l'applicazione ha bisogno di sapere la sua definizione. Sfortunatamente, al momento esiste solo una versione JAR della libreria e (a differenza degli AAR) la definizione necessaria non viene integrata correttamente quando viene creata l'app.

Provare a copiare il file attrs.xml dalla sorgente libreria

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

nella cartella res/values.

Credo che dovrebbe risolvere il problema.