2016-01-25 24 views
17

Ngày tốt, tôi có hình ảnh SVG. Làm thế nào tôi có thể thêm nó vào ImageView nền?Cách sử dụng hình ảnh SVG trong ImageView

Tôi cố gắng để sử dụng this library Nhưng tôi có vấn đề:

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) 

Tôi đã làm gì?

Thứ nhất, tôi đã thêm dependency để gradle:

compile 'com.caverock:androidsvg:1.2.1' 

Thứ hai, tôi đã thay đổi 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" 
     /> 

Sau đó tôi thêm xmls:svgimageview để nhổ tận gốc bố trí:

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

Đây là clock.svg nằm trong thư mục assets.

+1

"Nhưng tôi gặp sự cố" - khi đặt câu hỏi về Stack Overflow, vui lòng cung cấp toàn bộ dấu vết ngăn xếp. – CommonsWare

+0

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

Trả lời

45

Trong mới Android Studio có khả năng nhập khẩu SVG để tập tin XML, do đó, bạn không cần phải sử dụng thư viện bên ngoài.

Trong nhấp chuột phải có thể kéo -> Mới -> Nội dung Vector -> Tệp SVG cục bộ.

enter image description here

Sau đó, Bạn sử dụng nó thường như drawables khác:

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

Trong trường hợp sử dụng Thư viện hỗ trợ, hãy thêm 'ứng dụng: srcCompat =" @ drawable/btn_image "' – lomza

+2

Hỗ trợ cho SVG nâng cao các tính năng có vẻ khá yếu. –

+0

Đó là một ý tưởng hay nhưng không trả lời được câu hỏi. Định dạng vector có thể vẽ của Android là * khủng khiếp * cho tất cả trừ các hình ảnh đơn giản nhất. SVG từ các công cụ thiết kế đồ họa phổ biến không chuyển đổi tốt và Studio/Android thậm chí không làm tốt công việc tôn trọng kích thước của hình ảnh. – spaaarky21

1

Trên các thiết bị mới hơn đã bật hiển thị phần cứng theo mặc định, bạn cần phải bật hiển thị phần mềm một cách rõ ràng.

imgView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

HOẶC thêm thẻ này trong xml của bạn

android:layerType="software" 
1

Để sử dụng đúng cách các thuộc tính svgimageview:svg, ứng dụng cần phải biết đó là định nghĩa. Thật không may, chỉ có một phiên bản JAR của thư viện vào lúc này, và (không giống như với AAR), định nghĩa cần thiết không được hợp nhất đúng khi ứng dụng được xây dựng.

Cố gắng sao chép các tập tin attrs.xml từ nguồn thư viện

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

vào thư mục res/values của bạn.

Tôi tin rằng điều đó sẽ khắc phục được sự cố của bạn.

Các vấn đề liên quan