【问题标题】:How to use SVG image in ImageView如何在 ImageView 中使用 SVG 图像
【发布时间】:2016-05-01 14:56:51
【问题描述】:

美好的一天,我有一张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 文件夹中。

【问题讨论】:

标签: android svg androidsvg


【解决方案1】:

在新的 Android Studio 中,可以将 SVG 导入 XML 文件,因此您不需要使用外部库。

在drawable中右键->新建->矢量资源->本地SVG文件。

然后你正常使用它作为其他drawables:

android:src="@drawable/btn_image"

【讨论】:

  • 如果使用支持库,请添加app:srcCompat="@drawable/btn_image"
  • 对高级 SVG 功能的支持似乎很弱。
  • 这是个好主意,但不能回答问题。除了最简单的图像之外,Android 的矢量可绘制格式糟糕。来自常见图形设计工具的 SVG 不能很好地转换,而且 Studio/Android 甚至不能很好地尊重图像的大小。
  • 你是对的,你应该尽可能使用 XML drawables,但是如果你正在远程下载 SVG 图像,那么这个库将是有益的。因为使用 webviews 很糟糕
  • 这必须在编译时完成。如果我有一个在运行时从服务器下载的 SVG 图像怎么办?
【解决方案2】:

在默认开启硬件渲染的较新设备上,您需要明确开启软件渲染。

imgView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

或者在你的xml中添加这个标签

android:layerType="software"

【讨论】:

    【解决方案3】:

    要正确使用svgimageview:svg 属性,应用程序需要知道它的定义。不幸的是,目前只有 JAR 版本的库,并且(与 AAR 不同)在构建应用程序时所需的定义没有正确合并。

    尝试从库源复制attrs.xml 文件

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

    进入您的res/values 文件夹。

    我相信这应该可以解决您的问题。

    【讨论】:

      【解决方案4】:

      虽然 SVG 是基于 XML 的 Vector 图片,但 Imageview 只能渲染 XML(Vector Drawables)。因此,我们需要将 SVG 转换为 XML 格式。我们可以使用 Android Vector Asset Studio 来实现。

      这可能有助于将 SVG、PSD 转换为 XML
      https://medium.com/@iamitgupta1994/converting-svg-psd-to-xml-vector-drawable-using-android-vector-asset-studio-8e8ec23d5405

      【讨论】:

        【解决方案5】:

        右键单击Drawable -> New -> Vector Asset -> 选择本地文件(SVG,PSD) 选择图片所在的路径

        示例 /Users/yourpcname/Desktop/taka.svg

        将drawable保存为xml文件 然后你就可以在你的 imageview 中使用了。

        【讨论】:

          【解决方案6】:

          找到您的 svg 图像所在的位置。右键单击 res 上的可绘制文件夹, 选择new>>>>Vector Asset>>>Local SVG>>>>并保存为xml

          【讨论】:

            猜你喜欢
            • 2014-09-23
            • 2019-02-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-10
            • 2020-06-06
            • 2012-09-19
            相关资源
            最近更新 更多