web-dev-qa-db-fra.com

Comment utiliser une image SVG dans ImageView

Bonjour, j'ai une image SVG. Comment puis-je l'ajouter à ImageView background?

J'ai essayé d'utiliser cette bibliothèque Mais j'ai un problème:

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)

Qu'est-ce que j'ai fait?

Tout d'abord, j'ai ajouté dependency à gradle:

compile 'com.caverock:androidsvg:1.2.1'

Deuxièmement, j'ai changé ImageView en 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"
         />

Après cela, j'ai ajouté xmls:svgimageview à la disposition racine:

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

Cette clock.svg est dans le dossier assets.

35
VLeonovs

Dans le nouveau Android Studio, il est possible d’importer un fichier SVG au format XML. Il n’est donc pas nécessaire d’utiliser une bibliothèque externe.

Cliquez avec le bouton droit de la souris sur -> Nouveau -> Actif vectoriel -> Fichier SVG local.

enter image description here

Ensuite, vous l'utilisez normalement comme autres dessinables:

Android:src="@drawable/btn_image"
87
Marek Multarzyński

Pour utiliser correctement l'attribut svgimageview:svg, L'application doit connaître sa définition. Malheureusement, il n’existe pour le moment qu’une version JAR de la bibliothèque et (contrairement aux AAR), la définition nécessaire n’est pas correctement fusionnée lors de la création de l’application.

Essayez de copier le fichier attrs.xml À partir de la source de la bibliothèque.

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

dans votre dossier res/values.

Je crois que cela devrait résoudre votre problème.

2
Paul LeBeau

Sur les nouveaux périphériques pour lesquels le rendu matériel est activé par défaut, vous devez activer explicitement le rendu logiciel.

imgView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

OU ajouter cette balise dans votre xml

Android:layerType="software"
2
Ahsan Kamal

Bien que SVG soit une image vectorielle basée sur XML, Imageview ne peut restituer que du XML (Vector Drawables). Ainsi, nous devons convertir SVG au format XML. Nous pouvons le faire en utilisant Android Vector Asset Studio.

Cela peut être utile pour convertir SVG, PSD en XML
https://medium.com/@iamitgupta1994/converting-svg-psd-to-xml-vector-drawable-using-Android-vector-asset-studio-8e8ec23d5405

1
Amit Gupta

Localisez l’emplacement de votre image svg.Rightclick dessinez le dossier à la résolution, choisissez un nouveau >>>> fichier vectoriel >>> SVG local >>>> et enregistrez-le au format xml

0
Marg