VectorDrawable - bằng cách nào đó nó có sẵn cho các phiên bản Android trước Lollipop? [đóng cửa]


87

Lý lịch

Tôi nhận thấy rằng Android hiện hỗ trợ một số kiểu vẽ vector, thông qua một lớp có tên " VectorDrawable " (và cả AnimatedVectorDrawable , BTW). Tôi đã tìm thấy về nó bằng cách xem có gì mới trên Android-Studio .

Tôi tự hỏi nếu điều này sẽ là sự kết thúc của việc phải đưa nhiều file vào nhiều thư mục ( mdpi, hdpi, xhdpi, vv). Điều đó sẽ rất tuyệt và có thể giảm thiểu kích thước ứng dụng trong một số trường hợp.

Những câu hỏi

Tôi muốn hỏi một số câu hỏi liên quan đến lớp học mới này:

  1. Có thể sử dụng nó trong các phiên bản Android cũ hơn, có thể thông qua một thư viện thậm chí là thư viện hỗ trợ của Google không?

  2. Tôi không quen với cách nó hoạt động, nhưng Lollipop có thể xử lý các tệp SVG không? Nó có thể làm bất cứ điều gì có thể đạt được trên các tệp SVG không?

  3. Có bất kỳ mẫu / hướng dẫn / video nào về cách sử dụng nó, ngoài tài liệu tôi đã tìm thấy không?


3
Theo như tôi thấy, VectorDrawable là androidification các tập tin SVG. Tuy nhiên, tôi đang sử dụng SVG s hơn một năm qua việc sử dụng các thư viện của bên thứ ba . ( android-svg , svg-android và tương tự). Có những cái tên tương tự. Mỗi cái khác với những cái khác, vì vậy, hãy lựa chọn chính xác tùy thuộc vào nhu cầu của bạn.
Phantômaxx

7
Tôi đã tạo công cụ trực tuyến để chuyển đổi SVG thành vectơ tài nguyên xml (chỉ dành cho kẹo mút) - inloop.github.io/svg2android - Nó vẫn chưa được thử nghiệm nhiều trong giai đoạn đầu alpha. Nó hỗ trợ các tệp svg đơn giản (như android hỗ trợ), tôi đã thử nghiệm Nó với inkscape - vẽ một số hình dạng (hình chữ nhật, hình tròn, xoắn ốc ...), chọn tất cả rồi chọn "Path-> Object to path", xuất thành * .svg và được đưa vào trang web, tạo xml và hoạt động tốt.
Yuraj

1
@Yuraj Chà, thật tuyệt! công việc tuyệt vời! Và trong thời gian ngắn ... Đây, hãy +1 của tôi. :)
nhà phát triển android

Liên quan đến inloop.github.io/svg2android ... Nó s a very usefull tool but Iđã nhận được kết quả không đúng trong trường hợp như vậy và tôi không biết điều gì là sai ... Hmmm, để phát hành thêm, tôi ước công cụ này sẽ thông báo về định dạng xấu ... Nếu tôi đã qua sử dụng tinh khiết svg-files với 3 bên libs mọi thứ đều Ok ...
Alex Zezekalo

@AlexZezekalo Bạn nên viết về nó trên trang web Github của nó: github.com/inloop/svg2android
nhà phát triển android

Câu trả lời:


39

CẬP NHẬT VÀO THÁNG 3/2016

Bằng bản cập nhật Thư viện hỗ trợ Android 23.2.1 , Hỗ trợ Bản vẽ vector và Bản vẽ vector hoạt hình. (bạn cũng có thể sử dụng phiên bản mới nhất cho tương tự)

Vui lòng cập nhật phiên bản của thư viện trong tệp gradle.

compile 'com.android.support:recyclerview-v7:23.2.1'

Vector có thể vẽ cho phép bạn thay thế nhiều nội dung png bằng một đồ họa vector duy nhất , được định nghĩa trong XML. Mặc dù trước đây bị giới hạn ở Lollipop và các thiết bị cao hơn , cả hai VectorDrawableAnimatedVectorDrawablehiện đã có sẵn thông qua hai Thư viện hỗ trợ mới hỗ trợ-vector-drawableanimation -vector-drawable. app:srcCompatthuộc tính mới để tham chiếu vector có thể vẽ.

Kiểm tra nguồn trên github với một số ví dụ mẫu .

Các thay đổi đối với thư viện appcompat v7:

Hoàn nguyên sự phụ thuộc vào nội dung vectơ để các nhà phát triển sử dụng thư viện appcompat không bị buộc phải sử dụng VectorDrawablevà các cờ xây dựng liên quan của nó.


3
Về hỗ trợ vectơ, việc cập nhật plugin gradle và sử dụng "vectorDrawables.useSupportLibrary = true" bên trong "defaultConfig" có đủ không?
nhà phát triển android

1
vâng, đối với Gradle Plugin 2.0+ và đối với Gradle Plugin 1.5, bạn cần thêm -> android {defaultConfig {createdDensities = []} // Việc này được xử lý cho bạn bởi 2.0+ Gradle Plugin aaptOptions {addParameters "--no-version -vectors "}}
Amit Vaghela

1
Ngoài ra, vui lòng hiển thị một số mã ở đây. Một liên kết có thể đã chết vào một ngày nào đó. Bạn sẽ nhận được +1 cho nỗ lực này :)
nhà phát triển android

có chắc chắn. sẽ đăng mã trong thời gian ngắn trên git và tại đây.
Amit Vaghela

2
Các compiletuyên bố trên ngụ ý rằng việc sử dụng dự án RecyclerViewmà không phải là luôn luôn như vậy.
razzledazzle

13

Cập nhật 2 : Họ kích hoạt lại nó trong Thư viện hỗ trợ 23.4.0:

Đối với người dùng AppCompat, chúng tôi đã thêm một API chọn tham gia để bật lại hỗ trợ Vector Drawable từ tài nguyên (hành vi được tìm thấy trong 23.2) thông qua AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) - hãy nhớ rằng điều này vẫn có thể gây ra sự cố với việc sử dụng bộ nhớ và sự cố cập nhật các phiên bản Cấu hình, do đó lý do tại sao nó bị tắt theo mặc định.

Kiểm tra 23.4.0 này hiện có sẵn

Cập nhật : Điều này không hoạt động từ phiên bản 23.3.0 Kiểm tra tại đây để biết chi tiết. Proxy có thể kéo không hoạt động. app:srcCompatsetImageResource()làm việc, tuy nhiên.


Hỗ trợ Vector Drawable có sẵn từ Thư viện hỗ trợ của phiên bản 23.2 trở lên. Tuy nhiên, để sử dụng hợp lý các đồ có thể kéo đó, chúng phải được tham chiếu gián tiếp.

Bước đầu tiên sẽ là cập nhật AppCompatphiên bản.

compile 'com.android.support:appcompat-v7:23.2.0'

Thứ hai cho phép hỗ trợ Vector Drawable. Nếu sử dụng plugin Gradle, 2.0+

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
}

Nếu không thì

android {  
   defaultConfig {  
     generatedDensities = []  
   }  

   aaptOptions {  
     additionalParameters "--no-version-vectors"  
   }  
}

Thứ ba , hãy tham khảo câu trả lời được liên kết .


vâng, tôi đã thấy điều này. Cảm ơn bạn về thông tin mở rộng. Tôi cho rằng cho các công cụ rộng hệ thống (thông báo, vật dụng, ...) đây là tất nhiên không có sẵn ...
nhà phát triển Android

Chắc chắn rằng nó sẽ hoạt động. Về cơ bản, nó có thể tham chiếu đến các phần có thể kéo được từ thời điểm đó Bạn đã thử chưa? Ví dụ ở đó đặt một vectơ có thể vẽ thành a MenuItem, hoạt động tốt.
razzledazzle

Bạn có chắc nó sẽ hoạt động ngay cả với các thông báo và tiện ích con? Tôi đang nói về việc làm cho nó hoạt động trên các phiên bản Android cũ. Làm thế nào họ có thể xử lý các vectơ cho điều này? Họ không thể sử dụng thư viện hỗ trợ, phải không?
nhà phát triển android

Toàn bộ điểm của việc sử dụng phiên bản Thư viện hỗ trợ là làm cho mọi thứ hoạt động trong các phiên bản cũ hơn. Như ghi nhận, nó hoạt động tất cả các con đường trở về API 7 và drawables vector động từ API 11.
razzledazzle

Một lần nữa, điều này hoạt động bên trong ứng dụng, nhưng điều gì sẽ xảy ra nếu bạn thử sử dụng chúng bên ngoài, như trên thông báo và tiện ích? Tôi không nghĩ rằng nó sẽ hoạt động ở đó, bởi vì tôi không nghĩ rằng bạn có thể làm cho các ứng dụng khác (trình khởi chạy) sử dụng thư viện hỗ trợ, chứ đừng nói đến thanh thông báo. Bạn đã thử chưa?
nhà phát triển android

12

Bạn có thể thử thư viện hỗ trợ này . Nó hỗ trợ VectorDrawable và AnimatedVectorDrawable được giới thiệu trong Lollipop với khả năng tương thích ngược hoàn toàn.


Thư viện đó chỉ tương thích với API cấp 14 trở lên, trong khi thư viện Mr Vector tương thích xuống 7+.
donturner

@donturner: Tôi đồng ý với quan điểm của bạn, nhưng tôi không nghĩ rằng các nhà phát triển vẫn đang phát triển ứng dụng cho 7 API.
V_J

4
Có thể không phải là API 7, nhưng chắc chắn là API 10 (Gingerbread) vì điều này chiếm 4,1% thị trường Android ( developer.android.com/about/dashboards/index.html ).
donturner

8

Để bổ sung cho một số câu trả lời ở đây: có, bạn có thể nhận hỗ trợ cho VectorDrawables trước Lollipop , ít nhất là một phần.

Một phần như thế nào? Nó phụ thuộc - tôi đã tạo sơ đồ này để trợ giúp (hợp lệ cho Thư viện hỗ trợ 23.4.0 đến - ít nhất - 25.1.0).

VectorDrawable cheatsheet


Trên thực tế, nhưng tôi nghĩ rằng nếu bạn cho phép nó tự động tạo các file png, nó phải là an toàn
android phát triển

1
Giải thích một cách chính xác.
Abhijit Kurane

Đây phải là câu trả lời được chấp nhận. Cảm ơn.
Justin Meiners

6

Rất tiếc, tại thời điểm này VectorDrawable và AnimatedVectorDrawable không có sẵn trong thư viện hỗ trợ. Nhưng để tận dụng tính năng này trong các phiên bản Pre-Lollipop, bạn có thể sử dụng backport không chính thức có tên MrVector.

MrVector có sẵn trong Github và nó sẽ hỗ trợ các phiên bản Android 7+.

Từ Readme chính thức

Để thêm phụ thuộc MrVector, hãy thêm dòng sau vào khối phụ thuộc build.gradle của bạn.

compile 'com.telly:mrvector:0.2.0'

Để tạo tệp có thể vẽ từ XML vectơ,

Drawable drawable = MrVector.inflate(getResources(), R.drawable.vector_android);

Hi vọng điêu nay co ich.


1
MrVector đã không còn được sử dụng cách đây vài ngày vì VectorDrawableCompat sắp tới sẽ là một phần của thư viện hỗ trợ.
WindRider

Thật là tuyệt. Cảm ơn bạn về thông tin.
gnuanu

Ye, tôi không thể chờ đợi để dắt lên ứng dụng của tôi với một số chất béo ass SVG của: D
WindRider

1
Không được chấp nhận. Thay vào đó, hãy sử dụng stackoverflow.com/a/30502261/1954675 .
V_J

3

Nếu bạn đang sử dụng VectorDrawable, Android Studio sẽ tự động tạo tệp PNG (dựa trên tệp XML của bạn) cho các phiên bản Pre-Lollipop.

Lưu ý rằng các tệp PNG được tạo đó được coi là BitmapDrawables thay vì VectorDrawables trên các thiết bị chạy API dưới 21 và do đó không thể được làm động hoặc tương tự trên các thiết bị đó.

Xem "khả năng tương thích ngược" để biết thêm chi tiết: http://android-developers.blogspot.co.at/2015/09/android-studio-14.html


Có, nó đã được xuất bản gần đây. Tuy nhiên, nó sử dụng PNG, thay vì sử dụng vectơ, vì vậy nếu tôi thay đổi kích thước của imageView chứa hình ảnh, nó sẽ bị pixel / mờ.
nhà phát triển android

Nhà phát triển @android: Bạn đúng một phần. Hành vi này sẽ xảy ra, nhưng điều này sẽ giống nhau đối với VectorDrawables. Mỗi VectorDrawable có chiều rộng và chiều cao được xác định trong XML của nó (ví dụ: vector_drawable.xml). Nếu chiều rộng / chiều cao này được đặt thành 50x50dp nhưng bạn đặt kích thước ImageView thành 100x100dp, kết quả sẽ vẫn bị mờ ngay cả khi bạn đang chạy Android 5.0 (và do đó đang sử dụng VectorDrawable thay vì BitmapDrawable được tạo tự động). Lợi ích thực sự của VectorDrawable so với Bitmap thông thường là nó xử lý độ phân giải màn hình và do đó sẽ không làm mờ ngay cả trên màn hình 4k.
Mehlyfication

Ý bạn là VectorDrawable không hiển thị tốt khi sử dụng kích thước không được đặt cho nó? Nhưng đó là một nội dung được vector hóa .... Tại sao nó sẽ hoạt động khác?
nhà phát triển android

Nó cũng tạo ra pngs cho Animated Vector Drawables?
Louis CAD

Không, nó sẽ không tạo PNG cho trường hợp đó. Nếu bạn muốn tạo hoạt ảnh cho vector có thể vẽ trên các thiết bị chạy phiên bản Android trước Android 5.0, bạn có thể muốn thử VectorDrawableCompat: developer.android.com/reference/android/support/graphics/…
Mehlyfication

3

Lollipop không thể xử lý tệp SVG nếu không có lib của bên thứ ba.

Giải pháp tốt nhất mà tôi tìm thấy là BetterVectorDrawable lib cùng với Bộ chuyển đổi SVG sang VectorDrawable .

BetterVectorDrawable là triển khai VectorDrawable cho Android 4.0+ với hành vi dự phòng có thể định cấu hình trên Android 5.0+.

SVG to VectorDrawable Converter là công cụ chuyển đổi hàng loạt hình ảnh SVG sang tệp tài nguyên XML VectorDrawable của Android. Phiên bản trực tuyến

Các liên kết trỏ đến các readmes, cung cấp đủ thông tin về cách sử dụng lib và trình chuyển đổi.


2

Không có VectorDrawables nào trong thư viện hỗ trợ tại thời điểm này.

Funkystein nói đúng - VectorDrawable tương tự như SVG, chỉ hỗ trợ các tính năng vẽ vector được yêu cầu cao nhất để android có thể tập trung vào hiệu suất. pathData, chẳng hạn có cùng định dạng với chuỗi "d" của SVG.


Vì vậy, điều này sẽ chỉ phù hợp khi Lollipop đủ phổ biến và thậm chí sau đó, nó không cung cấp nhiều tính năng. :(
nhà phát triển android

Bạn có biết bất kỳ hướng dẫn / mẫu / video nào về các API vectơ mới không?
nhà phát triển Android


1

Tin tuyệt vời là Google đã phát hành Thư viện hỗ trợ Android 23.2 Hỗ trợ Bản vẽ vector và Bản vẽ vector hoạt hình!

Nhưng cảm ơn những người đã chuyển thư viện này trước Google!

Đây là nơi mà các thư viện AppCompat rất tuyệt vời, chúng có thể mang nhiều tính năng mới của Android trở lại các phiên bản trước đó nhiều. Với lớp VectorDrawable mới được triển khai, các nhà phát triển giờ đây có thể sử dụng hình ảnh vector từ API 7 (Android 2.1 Eclair). Các vectơ hoạt ảnh bị hạn chế hơn một chút, chỉ trở lại như API 11 (Android 3.0 Honeycomb), nhưng điều đó vẫn bao gồm hơn 97% thiết bị đang được sử dụng hiện nay

Hướng dẫn sử dụng:

Tham khảo " age-of-the-vectors " của @chrisbanes


1
Đẹp! bạn có thể vui lòng chia sẻ một số mẫu / hướng dẫn về cách sử dụng API vectors của thư viện hỗ trợ mới không?
nhà phát triển android

Chắc chắn rồi ! đã thêm điều đó vào danh sách công việc cuối tuần của tôi! :)
LOG_TAG

1
Cảm ơn bạn. Nếu nó ngắn, xin vui lòng viết ở đây.
nhà phát triển android
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.