VectorDrawable - มีให้บริการสำหรับ Android เวอร์ชันก่อนอมยิ้มหรือไม่ [ปิด]


88

พื้นหลัง

ฉันสังเกตเห็นว่าตอนนี้ Android รองรับการวาดเวกเตอร์บางประเภทผ่านคลาสที่เรียกว่า " VectorDrawable " (และAnimatedVectorDrawable , BTW) ฉันค้นพบแล้วโดยดูว่ามีอะไรใหม่ในAndroid-Studio Android

ฉันสงสัยว่าเรื่องนี้จะเป็นจุดสิ้นสุดของต้องใส่หลายไฟล์ในโฟลเดอร์หลาย ( mdpi, hdpi, xhdpiฯลฯ ) ซึ่งจะดีมากและอาจลดขนาดแอปในบางกรณี

คำถาม

ฉันต้องการถามคำถามสองสามข้อเกี่ยวกับชั้นเรียนใหม่นี้:

  1. เป็นไปได้ไหมที่จะใช้ใน Android เวอร์ชันเก่าหรืออาจจะผ่านทางไลบรารีของห้องสมุดสนับสนุนของ Google

  2. ฉันไม่คุ้นเคยกับวิธีการทำงาน แต่ Lollipop สามารถจัดการไฟล์ SVG ได้หรือไม่ สามารถทำอะไรก็ได้ที่ทำได้ในไฟล์ SVG หรือไม่?

  3. มีตัวอย่าง / บทแนะนำ / วิดีโอการใช้งานนอกเหนือจากเอกสารที่ฉันพบหรือไม่?


3
เท่าที่ฉันเห็น VectorDrawable คือแอนดรอยด์ของไฟล์ SVG ฉันใช้SVGสำหรับในช่วงปีที่ผ่านการใช้ห้องสมุดของบุคคลที่ 3แม้ว่า ( android-svg , svg-androidและอื่น ๆ ) มีชื่อคล้าย ๆ กัน แต่ละคนแตกต่างจากคนอื่น ๆ ดังนั้นเลือกให้ถูกต้องตามความต้องการของคุณ
Phantômaxx

7
ฉันได้สร้างเครื่องมือออนไลน์สำหรับการแปลง SVG เป็นเวกเตอร์ทรัพยากร xml (อมยิ้มเท่านั้น) - inloop.github.io/svg2android - ยังไม่ได้รับการทดสอบมากนักซึ่งยังอยู่ในอัลฟ่าต้น ๆ มันรองรับไฟล์ svg ง่าย ๆ (ตามที่ Android รองรับ) ฉันได้ทดสอบด้วย inkscape - วาดรูปทรงบางอย่าง (rect, circle, spiral ... ) เลือกทั้งหมดแล้วเลือก "Path-> Object to path" ส่งออกไปยัง * .svg และ หลุดเข้าไปในไซต์สร้าง xml และใช้งานได้ดี
Yuraj

1
@ ยูราจว้าวเจ๋งมาก! การทำงานที่ดี ! และในช่วงเวลาสั้น ๆ ... ที่นี่ใช้ +1 ของฉัน :)
นักพัฒนา Android

เกี่ยวกับinloop.github.io/svg2android ... มันs a very usefull tool but Iได้ผลลัพธ์ที่ไม่เหมาะสมในกรณีดังกล่าวและฉันไม่รู้ว่ามีอะไรผิดปกติ ... อืมสำหรับการเปิดตัวเพิ่มเติมฉันหวังว่าเครื่องมือนี้จะแจ้งให้ทราบเกี่ยวกับรูปแบบที่ไม่ดี ... หากฉัน ใช้ไฟล์ svg บริสุทธิ์กับ libs ของบุคคลที่สามทุกอย่างโอเค ...
Alex Zezekalo

@AlexZezekalo คุณควรเขียนเกี่ยวกับเรื่องนี้ในหน้าเว็บ Github: github.com/inloop/svg2android
พัฒนา Android

คำตอบ:


39

อัพเดทเมื่อมีนาคม 2559

โดยการอัปเดตAndroid Support Library 23.2.1 รองรับ Vector Drawables และ Animated Vector Drawables (คุณสามารถใช้ latestone ได้เช่นกัน)

โปรดอัปเดตเวอร์ชันของไลบรารีในไฟล์ gradle

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

Vector drawables ช่วยให้คุณสามารถแทนที่เนื้อหา png หลายรายการด้วยกราฟิกแบบเวกเตอร์เดียวซึ่งกำหนดใน XML ขณะที่ก่อนหน้านี้ที่จะ จำกัด อมยิ้มและอุปกรณ์ที่สูงขึ้นทั้งในVectorDrawableและAnimatedVectorDrawableมีวางจำหน่ายแล้วผ่านสองใหม่ห้องสมุดสนับสนุนสนับสนุนเวกเตอร์ drawableและภาพเคลื่อนไหวเวกเตอร์-drawable app:srcCompatแอตทริบิวต์ใหม่สำหรับอ้างอิงเวกเตอร์ drawables

ตรวจสอบแหล่งที่มาบนGitHubกับบางตัวอย่างตัวอย่าง

การเปลี่ยนแปลงสำหรับไลบรารี v7 appcompat:

เปลี่ยนกลับการพึ่งพาเนื้อหาเวกเตอร์เพื่อให้นักพัฒนาที่ใช้ไลบรารี appcompat ไม่ถูกบังคับให้ใช้VectorDrawableและแฟล็ก build ที่เกี่ยวข้อง


3
เกี่ยวกับการสนับสนุนเวกเตอร์การอัปเดตปลั๊กอิน gradle และใช้ "vectorDrawables.useSupportLibrary = true" ภายใน "defaultConfig" ไม่เพียงพอหรือไม่
นักพัฒนา android

1
ใช่สำหรับGradle Plugin 2.0+และสำหรับGradle Plugin 1.5คุณต้องเพิ่ม-> android {defaultConfig {createdDensities = []} // สิ่งนี้จัดการให้คุณโดย aaptOptions 2.0+ Gradle Plugin {additionalParameters "--no-version -vectors "}}
Amit Vaghela

1
นอกจากนี้โปรดแสดงรหัสบางส่วนที่นี่ ลิงค์อาจจะหายไปสักวัน คุณจะได้รับ +1 สำหรับความพยายามนี้ :)
นักพัฒนา Android

ใช่แน่นอน. จะโพสต์รหัสในช่วงเวลาสั้น ๆ บนคอมไพล์และที่นี่
Amit Vaghela

2
compileข้อความข้างต้นแสดงให้เห็นว่าการใช้โครงการRecyclerViewซึ่งไม่เสมอกรณี
razzledazzle

14

อัปเดต 2 : เปิดใช้งานอีกครั้งในไลบรารีสนับสนุน 23.4.0:

สำหรับผู้ใช้ AppCompat เราได้เพิ่มเลือกใช้ API เพื่อเปิดใช้งานการสนับสนุน Vector Drawables จากทรัพยากรอีกครั้ง (ลักษณะการทำงานที่พบใน 23.2) ผ่าน AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) - โปรดทราบว่าสิ่งนี้ยังอาจทำให้เกิดปัญหากับการใช้หน่วยความจำและ ปัญหาในการอัปเดตอินสแตนซ์การกำหนดค่าด้วยเหตุนี้จึงปิดใช้งานโดยค่าเริ่มต้น

ตรวจสอบ23.4.0นี้พร้อมใช้งานแล้ว

อัปเดต : สิ่งนี้ใช้ไม่ได้จากเวอร์ชัน 23.3.0 ตรวจสอบรายละเอียดที่นี่ พร็อกซี drawables ไม่ทำงาน app:srcCompatและsetImageResource()ทำงานอย่างไร


การสนับสนุน Vector Drawable พร้อมใช้งานจากไลบรารีการสนับสนุนเวอร์ชัน 23.2 ขึ้นไป อย่างไรก็ตามในการใช้ drawables เหล่านั้นอย่างถูกต้องจะต้องอ้างอิงโดยอ้อม

ขั้นตอนแรกคือการชนAppCompatรุ่น

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

ประการที่สองเปิดใช้งานการสนับสนุน Vector Drawable หากใช้ปลั๊กอิน Gradle 2.0+

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
}

มิฉะนั้น

android {  
   defaultConfig {  
     generatedDensities = []  
   }  

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

ประการที่สามให้ดูที่การเชื่อมโยงคำตอบ


ใช่ฉันเห็นสิ่งนี้ ขอบคุณสำหรับข้อมูลเพิ่มเติม ฉันคิดว่าสำหรับสิ่งต่างๆทั้งระบบ (การแจ้งเตือนวิดเจ็ต ... ) แน่นอนว่าไม่มีให้ใช้งาน ...
นักพัฒนา Android

แน่นอนว่าควรใช้งานได้ โดยพื้นฐานแล้วอ้างอิงจากจุดนั้นเป็นต้นไป คุณลองแล้วหรือยัง? ตัวอย่างนี้กำหนดเวกเตอร์ที่วาดได้เป็น a MenuItemซึ่งใช้งานได้ดี
razzledazzle

คุณแน่ใจหรือไม่ว่าจะใช้งานได้แม้กระทั่งสำหรับการแจ้งเตือนและวิดเจ็ต ฉันกำลังพูดถึงการทำให้มันใช้งานได้กับ Android เวอร์ชันเก่า พวกเขาจัดการเวกเตอร์สำหรับสิ่งนี้ได้อย่างไร? พวกเขาใช้ไลบรารีการสนับสนุนไม่ได้ใช่ไหม
นักพัฒนา Android

จุดรวมของการใช้เวอร์ชัน Support Library คือการทำให้สิ่งต่างๆทำงานได้ในเวอร์ชันเก่า ตามที่บันทึกไว้มันใช้งานได้ตลอดทางกลับไปที่ API 7 และ Animated vector drawables จาก API 11
razzledazzle

อีกครั้งสิ่งนี้ใช้งานได้ภายในแอพ แต่ถ้าคุณลองใช้ภายนอกเช่นการแจ้งเตือนและวิดเจ็ตล่ะ? ฉันไม่คิดว่ามันจะใช้งานได้ที่นั่นเพราะฉันไม่คิดว่าคุณจะทำให้แอพอื่น ๆ (ตัวเรียกใช้งาน) ใช้ไลบรารีการสนับสนุนได้นับประสาอะไรกับแถบการแจ้งเตือน คุณลองแล้วหรือยัง?
นักพัฒนา Android

12

คุณสามารถลองใช้ไลบรารีการสนับสนุนนี้ รองรับ VectorDrawable และ AnimatedVectorDrawable ที่นำมาใช้ใน Lollipop พร้อมความเข้ากันได้ย้อนหลังอย่างสมบูรณ์


ไลบรารีดังกล่าวเข้ากันได้กับ API ระดับ 14 ขึ้นไปเท่านั้นในขณะที่ไลบรารี Mr Vector เข้ากันได้ถึง 7+
donturner

@donturner: ฉันเห็นด้วยกับประเด็นของคุณ แต่ฉันไม่คิดว่า dev ยังคงพัฒนาแอพสำหรับ 7 API
V_J

4
อาจจะไม่ใช่ API 7 แต่เป็น API 10 (Gingerbread) อย่างแน่นอนเนื่องจากบัญชีนี้มีสัดส่วน 4.1% ของตลาด Android ( developer.android.com/about/dashboards/index.html )
donturner

8

เพื่อเติมเต็มคำตอบบางส่วนที่นี่: ใช่คุณสามารถรับการสนับสนุนสำหรับ VectorDrawables pre-Lollipopได้อย่างน้อยก็บางส่วน

บางส่วนอย่างไร? ขึ้นอยู่กับ - ฉันได้สร้างแผนภาพนี้เพื่อช่วย (ใช้ได้กับ Support Library 23.4.0 ถึง - อย่างน้อย - 25.1.0)

Cheatsheet VectorDrawable


อันที่จริง แต่ฉันคิดว่าถ้าคุณอนุญาตให้สร้างไฟล์ png โดยอัตโนมัติก็น่าจะปลอดภัย
นักพัฒนา android

1
อธิบายอย่างละเอียด
Abhijit Kurane

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ขอบคุณ.
Justin Meiners

6

น่าเสียดายที่ ณ เวลานี้ VectorDrawable และ AnimatedVectorDrawable ไม่มีอยู่ในไลบรารีสนับสนุน แต่เพื่อประโยชน์ของฟีเจอร์นี้ในเวอร์ชันก่อนอมยิ้มคุณสามารถใช้แบ็คพอร์ตที่ไม่เป็นทางการที่เรียกว่า MrVector

MrVector มีให้บริการใน Githubและจะรองรับ Android เวอร์ชัน 7+

จาก Readme อย่างเป็นทางการ

หากต้องการเพิ่มการพึ่งพา MrVector ให้เพิ่มบรรทัดต่อไปนี้ในบล็อกการอ้างอิง build.gradle ของคุณ

compile 'com.telly:mrvector:0.2.0'

ในการสร้างสิ่งที่ดึงได้จาก XML ของเวกเตอร์

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

หวังว่านี่จะช่วยได้


1
MrVector ได้เลิกใช้งานเมื่อไม่กี่วันที่ผ่านมาเพื่อสนับสนุน VectorDrawableCompat ที่กำลังจะมาถึงซึ่งจะเป็นส่วนหนึ่งของไลบรารีสนับสนุน
WindRider

นั่นเจ๋งจริงๆ ขอบคุณสำหรับข้อมูล.
gnuanu

ใช่ฉัน
แทบ

1
เลิกใช้แล้ว ใช้stackoverflow.com/a/30502261/1954675แทน
V_J

3

หากคุณใช้ VectorDrawable Android Studio จะสร้างโดยอัตโนมัติตามไฟล์ PNG (ตามไฟล์ XML ของคุณ) สำหรับเวอร์ชันก่อนอมยิ้ม

โปรดทราบว่าไฟล์ PNG ที่สร้างขึ้นเหล่านี้ถือเป็น BitmapDrawables แทน VectorDrawables บนอุปกรณ์ที่ใช้ API ต่ำกว่า 21 ดังนั้นจึงไม่สามารถเคลื่อนไหวหรือคล้ายกันบนอุปกรณ์เหล่านั้นได้

ดู "ความเข้ากันได้ย้อนหลัง" สำหรับรายละเอียดเพิ่มเติม: http://android-developers.blogspot.co.at/2015/09/android-studio-14.html


ใช่มีการเผยแพร่เมื่อไม่นานมานี้ อย่างไรก็ตามมันใช้ PNG แทนการใช้เวกเตอร์ดังนั้นหากฉันเปลี่ยนขนาดของ imageView ที่เก็บรูปภาพภาพนั้นจะเป็นพิกเซล / เบลอ
นักพัฒนา Android

ผู้พัฒนา @android: คุณพูดถูกบางส่วน ลักษณะการทำงานนี้จะเกิดขึ้น แต่จะเหมือนกันสำหรับ VectorDrawables VectorDrawable แต่ละตัวมีความกว้างและความสูงที่กำหนดไว้ภายใน XML (เช่น vector_drawable.xml) หากตั้งค่าความกว้าง / ความสูงนี้เป็น 50x50dp แต่คุณตั้งค่าขนาด ImageView เป็น 100x100dp ผลลัพธ์จะยังคงเบลอแม้ว่าคุณจะใช้ Android 5.0 ก็ตาม (ดังนั้นจึงใช้ VectorDrawable แทน BitmapDrawable ที่สร้างขึ้นโดยอัตโนมัติ) ประโยชน์ที่แท้จริงของ VectorDrawable บน Bitmap ทั่วไปคือการจัดการกับ screen-dpi เข้ามาพิจารณาดังนั้นจึงไม่เบลอแม้ในจอแสดงผล 4k
Mehlyfication

คุณหมายความว่า VectorDrawable แสดงผลได้ไม่ดีเมื่อใช้ขนาดที่ไม่ได้กำหนดไว้ใช่หรือไม่? แต่เป็นเนื้อหาที่เป็นเวกเตอร์ .... ทำไมมันถึงใช้งานได้?
นักพัฒนา Android

มันสร้าง png สำหรับ Animated Vector Drawables ด้วยหรือไม่?
Louis CAD

ไม่มันจะไม่สร้าง PNG สำหรับกรณีนั้น หากคุณต้องการทำให้เวกเตอร์วาดได้บนอุปกรณ์ที่ใช้ Android เวอร์ชันก่อน Android 5.0 คุณอาจต้องการลอง VectorDrawableCompat: developer.android.com/reference/android/support/graphics/…
Mehlyfication

3

Lollipop ไม่สามารถจัดการไฟล์ SVG หากไม่มี libs ของบุคคลที่สาม

ทางออกที่ดีที่สุดที่ผมพบคือBetterVectorDrawable lib ร่วมกับSVG ถึง VectorDrawable แปลง

BetterVectorDrawableคือการใช้งาน VectorDrawable สำหรับ Android 4.0+ ที่มีพฤติกรรมถอยกลับที่กำหนดค่าได้บน Android 5.0+

SVG เป็น VectorDrawable Converterคือตัวแปลงภาพ SVG เป็นไฟล์ทรัพยากร XML VectorDrawable ของ Android เวอร์ชันออนไลน์

ลิงก์ชี้ไปที่ readmes ซึ่งให้ข้อมูลเพียงพอเกี่ยวกับวิธีใช้ lib และตัวแปลง


2

ไม่มี VectorDrawables ในไลบรารีการสนับสนุนในขณะนี้

Funkystein ถูกต้อง - VectorDrawable คล้ายกับ SVG เพียงรองรับคุณสมบัติของการวาดภาพเวกเตอร์ที่เป็นที่ต้องการสูงสุดเพื่อให้ Android สามารถมุ่งเน้นไปที่ประสิทธิภาพได้ pathData เช่นมีรูปแบบเดียวกับสตริง "d" ของ SVG


ดังนั้นสิ่งนี้จะเกี่ยวข้องก็ต่อเมื่อ Lollipop ได้รับความนิยมมากพอและถึงแม้จะมีฟีเจอร์ไม่มากนัก :(
นักพัฒนา Android

คุณรู้จักบทช่วยสอน / ตัวอย่าง / วิดีโอของ vector API ใหม่หรือไม่
นักพัฒนา Android


1

ข่าวดีก็คือ Google เปิดตัวAndroid Support Library 23.2รองรับ Vector Drawables และ Animated Vector Drawables!

แต่ขอขอบคุณผู้ที่ย้ายไลบรารีนี้มาก่อน Google!

นี่คือที่ที่ไลบรารี AppCompat นั้นยอดเยี่ยมพวกเขาสามารถนำคุณสมบัติใหม่ ๆ ของ Android กลับไปใช้เวอร์ชันก่อนหน้าได้มาก ด้วยคลาส VectorDrawable ที่นำมาใช้ใหม่ตอนนี้นักพัฒนาสามารถใช้ภาพเวกเตอร์กลับไปที่ API 7 (Android 2.1 Eclair) ได้ เวกเตอร์แบบเคลื่อนไหวมีข้อ จำกัด มากกว่าเล็กน้อยโดยย้อนกลับไปถึง API 11 (Android 3.0 Honeycomb) เท่านั้น แต่ยังครอบคลุมอุปกรณ์มากกว่า 97% ที่ใช้งานอยู่ในปัจจุบัน

คำแนะนำในการใช้งาน:

อ้างถึง" age-of-the-vectors "โดย @chrisbanes


1
ดี! คุณช่วยแบ่งปันตัวอย่าง / บทช่วยสอนเกี่ยวกับการใช้ API เวกเตอร์ของไลบรารีสนับสนุนใหม่ได้ไหม
นักพัฒนา Android

ชัวร์! เพิ่มสิ่งนั้นในรายการสิ่งที่ต้องทำสุดสัปดาห์ของฉันแล้ว! :)
LOG_TAG

1
ขอขอบคุณ. ถ้าสั้นกรุณาเขียนที่นี่ด้วย
นักพัฒนา Android
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.