如何在 ImageView 中使用 SVG 图片
How to use SVG image in 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.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.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.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
文件夹中。
在默认打开硬件渲染的较新设备上,您需要明确打开软件渲染。
imgView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
或将此标签添加到您的 xml
android:layerType="software"
在新的 Android Studio 中,可以将 SVG 导入 XML 文件,因此您不需要使用外部库。
在drawable中右击->新建->矢量资源->本地SVG文件。
那么你可以正常使用它作为其他可绘制对象:
android:src="@drawable/btn_image"
要正确使用 svgimageview:svg
属性,应用需要知道它的定义。不幸的是,目前只有一个 JAR 版本的库,并且(与 AAR 不同)在构建应用程序时所需的定义没有正确合并。
尝试从库源
复制attrs.xml
文件
https://github.com/BigBadaboom/androidsvg/blob/master/androidsvg/src/main/res/values/attrs.xml
进入您的 res/values
文件夹。
我相信这应该可以解决您的问题。
右键单击 Drawable -> New -> Vector Asset -> select 本地文件(SVG、PSD)
select 你的图片路径
例子
/Users/yourpcname/Desktop/taka.svg
将可绘制对象保存为 xml 文件
然后你就可以在你的imageview中使用了。
尽管 SVG 是 XML-based 矢量图像,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
在 res 上找到你的 svg 图片 is.Rightclick 可绘制文件夹的位置,
选择新建>>>>矢量资源>>>本地SVG>>>>并将其保存为xml
美好的一天,我有一张 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.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.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.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
文件夹中。
在默认打开硬件渲染的较新设备上,您需要明确打开软件渲染。
imgView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
或将此标签添加到您的 xml
android:layerType="software"
在新的 Android Studio 中,可以将 SVG 导入 XML 文件,因此您不需要使用外部库。
在drawable中右击->新建->矢量资源->本地SVG文件。
那么你可以正常使用它作为其他可绘制对象:
android:src="@drawable/btn_image"
要正确使用 svgimageview:svg
属性,应用需要知道它的定义。不幸的是,目前只有一个 JAR 版本的库,并且(与 AAR 不同)在构建应用程序时所需的定义没有正确合并。
尝试从库源
复制attrs.xml
文件
https://github.com/BigBadaboom/androidsvg/blob/master/androidsvg/src/main/res/values/attrs.xml
进入您的 res/values
文件夹。
我相信这应该可以解决您的问题。
右键单击 Drawable -> New -> Vector Asset -> select 本地文件(SVG、PSD) select 你的图片路径
例子 /Users/yourpcname/Desktop/taka.svg
将可绘制对象保存为 xml 文件 然后你就可以在你的imageview中使用了。
尽管 SVG 是 XML-based 矢量图像,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
在 res 上找到你的 svg 图片 is.Rightclick 可绘制文件夹的位置, 选择新建>>>>矢量资源>>>本地SVG>>>>并将其保存为xml