เหตุใดสเกลเวกเตอร์ที่วาดได้ของฉันจึงไม่เป็นไปตามที่คาดไว้


99

ฉันกำลังพยายามใช้ vector drawables ในแอพ Android ของฉัน จากhttp://developer.android.com/training/material/drawables.html (เน้นของฉัน):

ใน Android 5.0 (API ระดับ 21) ขึ้นไปคุณสามารถกำหนด vector drawables ซึ่งปรับขนาดได้โดยไม่สูญเสียความหมาย

ใช้ drawable นี้:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" />

และ ImageView นี้:

<ImageView
    android:layout_width="400dp"
    android:layout_height="400dp"
    android:src="@drawable/icon_bell"/>

สร้างภาพที่พร่ามัวนี้เมื่อพยายามแสดงไอคอนที่ 400dp (บนอุปกรณ์มือถือความละเอียดสูงประมาณปี 2015 ที่ใช้อมยิ้ม)

เบลอ

การเปลี่ยนความกว้างและความสูงในคำจำกัดความของเวกเตอร์ที่วาดได้เป็น 200dp ช่วยปรับปรุงสถานการณ์ได้อย่างมากที่ขนาดการแสดงผล 400dp อย่างไรก็ตามการตั้งค่านี้เป็นแบบวาดได้สำหรับองค์ประกอบ TextView (เช่นไอคอนทางด้านซ้ายของข้อความ) จะสร้างไอคอนขนาดใหญ่

คำถามของฉัน:

1) เหตุใดจึงมีข้อกำหนดความกว้าง / ความสูงในเวกเตอร์ที่วาดได้ ฉันคิดว่าจุดทั้งหมดของสิ่งเหล่านี้คือการขยายขนาดขึ้นและลงโดยไม่สูญเสียทำให้ความกว้างและความสูงไม่มีความหมายในคำจำกัดความ?

2) เป็นไปได้หรือไม่ที่จะใช้เวกเตอร์ที่วาดได้ตัวเดียวซึ่งทำงานเป็น 24dp ที่วาดได้บน TextView แต่ปรับขนาดได้ดีเพื่อใช้ภาพที่ใหญ่กว่าด้วย เช่นฉันจะหลีกเลี่ยงการสร้างเวกเตอร์วาดหลายขนาดที่แตกต่างกันได้อย่างไรและใช้อันที่ปรับขนาดตามความต้องการที่แสดงผลของฉันได้อย่างไร

3) ฉันจะใช้แอตทริบิวต์ width / height ได้อย่างมีประสิทธิภาพอย่างไรและความแตกต่างกับ viewportWidth / Height คืออะไร?

รายละเอียดเพิ่มเติม:

  • อุปกรณ์กำลังเรียกใช้ API 22
  • ใช้ Android Studio v1.5.1 กับ Gradle เวอร์ชัน 1.5.0
  • Manifest เป็นคอมไพล์และกำหนดเป้าหมายระดับ 23 ขั้นต่ำระดับ 15 ฉันได้ลองเลื่อนระดับต่ำสุดไปที่ 21 ด้วย แต่สิ่งนี้ไม่แตกต่าง
  • การแยกไฟล์ APK (โดยตั้งค่าระดับต่ำสุดเป็น 21) จะแสดงทรัพยากร XML เดียวในโฟลเดอร์ที่วาดได้ ไม่มีการสร้างภาพแรสเตอร์

เพียงเพื่อให้ชัดเจน คุณกำลังใช้ Android studio? Android Studio เวอร์ชันใดและปลั๊กอิน Gradle เวอร์ชันใด เมื่อฉันคลิกขวาที่โฟลเดอร์ที่วาดได้ใน Android Studio และเลือกNew -> Vector Assetมันจะปล่อย XML ของภาพเวกเตอร์ลงในโฟลเดอร์ที่วาดได้ของฉัน อย่างไรก็ตามหากฉันใช้ apktool เพื่อคลายไฟล์ APK ที่สร้างขึ้นฉันเห็นว่าไฟล์ XML อยู่ในdrawable-anydpi-v21และปรับขนาดได้อย่างถูกต้องบนอุปกรณ์ API 21+ ไฟล์แรสเตอร์ถูกวางไว้ในdrawable-<mdpi/hdpi/etc>-v4โฟลเดอร์และไม่ได้ใช้กับอุปกรณ์ API 21+ (ขึ้นอยู่กับความจริงที่ว่ามันปรับขนาดได้อย่างถูกต้อง)
Cory Charlton

@ คอรีชาร์ลตัน. อยากรู้อยากเห็น. ฉันใช้ Studio 1.5.1 กับ Gradle 1.5.0 หลังจากเปลี่ยนระดับต่ำสุดเป็น 21 สถานที่เดียวที่รูปภาพจะปรากฏใน APK คือdrawableโฟลเดอร์ ความกว้าง / ความสูงในไฟล์ xml แบบเวกเตอร์ที่วาดได้คือ 24dp การระบุ ImageView ที่ความสูง / ความกว้าง 400dp เป็นการสร้างภาพที่มีขนาดไม่ดี
Chris Knight

นั่นคือสิ่งที่ฉันคาดหวัง เหตุผลเดียวที่ฉันลงเอยด้วยdrawable-anydpi-v21เพราะฉันminSdkVersionอายุน้อยกว่า 21 การเปลี่ยนแปลงพฤติกรรมใด ๆ หากคุณตั้งค่าเป็นminSdkVersionน้อยกว่า 21 สิ่งที่เกี่ยวกับการย้าย XML เพื่อdrawable-anydpi? ฉันไม่คาดคิดว่าจะมีการเปลี่ยนแปลง แต่ฉันก็คาดหวังว่าภาพเวกเตอร์ของคุณจะปรับขนาดได้อย่างถูกต้อง ...
Cory Charlton

การเปลี่ยนเวอร์ชันต่ำสุดกลับเป็น 15 จะให้ผลลัพธ์เช่นเดียวกับคุณ ไฟล์ xml เดียวที่drawable-anydpi-v21มีภาพแรสเตอร์ต่างๆใน mdi / hdpi / etc โฟลเดอร์ แม้ว่าจะไม่มีการเปลี่ยนแปลงผลลัพธ์ที่แสดงผลสุดท้าย
Chris Knight

แปลกมาก ... ฉันแก้ไขหนึ่งในแอปของฉันโดยใช้รูปภาพของคุณและใช้งานได้ดี (ดูคำตอบที่แก้ไขของฉัน)
Cory Charlton

คำตอบ:


103

มีข้อมูลใหม่เกี่ยวกับปัญหานี้ที่นี่:

https://code.google.com/p/android/issues/detail?id=202019

ดูเหมือนว่าการใช้ android:scaleType="fitXY"จะทำให้ขนาดของ Lollipop ถูกต้อง

จากวิศวกรของ Google:

สวัสดีโปรดแจ้งให้เราทราบว่า scaleType = 'fitXY' อาจเป็นวิธีแก้ปัญหาสำหรับคุณเพื่อให้ภาพดูคมชัด

Marshmallow Vs Lollipop เกิดจากการปรับขนาดพิเศษที่เพิ่มเข้าไปในมาร์ชเมลโล่

นอกจากนี้สำหรับความคิดเห็นของคุณ: "พฤติกรรมที่ถูกต้อง: เวกเตอร์ที่วาดได้ควรปรับขนาดโดยไม่สูญเสียคุณภาพดังนั้นหากเราต้องการใช้เนื้อหาเดียวกันในขนาดที่แตกต่างกัน 3 ขนาดในแอปพลิเคชันของเราเราไม่จำเป็นต้องทำ vector_drawable.xml ซ้ำ 3 ครั้งโดยที่ต่างกัน ขนาดฮาร์ดโค้ด "

แม้ว่าฉันจะเห็นด้วยอย่างยิ่งว่าควรเป็นเช่นนี้ แต่ในความเป็นจริงแพลตฟอร์ม Android มีข้อกังวลด้านประสิทธิภาพซึ่งเรายังไปไม่ถึงโลกในอุดมคติ ดังนั้นจึงแนะนำให้ใช้ vector_drawable.xml 3 แบบเพื่อประสิทธิภาพที่ดีขึ้นหากคุณแน่ใจว่าต้องการวาด 3 ขนาดที่แตกต่างกันบนหน้าจอในเวลาเดียวกัน

รายละเอียดทางเทคนิคโดยพื้นฐานแล้วเรากำลังใช้บิตแมปภายใต้เบ็ดเพื่อแคชการแสดงพา ธ ที่ซับซ้อนเพื่อให้เราได้รับประสิทธิภาพการวาดใหม่ที่ดีที่สุดเทียบเท่ากับการวาดใหม่บิตแมปที่วาดได้


29
โอเค Google มันแย่มากที่เราต้องคัดลอกและวางdrawables ที่เหมือนกันด้วยวิวพอร์ตและเส้นทางเดียวกันซึ่งมีขนาดต่างกันเท่านั้น
Miha_x64

สิ่งนี้ได้รับการแก้ไขบนอุปกรณ์ที่แสดงโลโก้ของฉันเป็นพิกเซล แต่ในหน่วยอื่นซึ่งทุกอย่างเรียบร้อยก่อนหน้านี้ตอนนี้อัตราส่วนภาพไม่ถูกต้อง ฉันไม่เข้าใจว่าทำไมถึงเป็นปัญหามันเป็นเวกเตอร์! ไม่ใช่พิกเซล! : P
tplive

@Harish Gyanani, android: scaleType = "fitXY" แก้ปัญหาได้ แต่ไอคอนแบบไดนามิกและไม่ใช่กำลังสองล่ะ?
Manuela

29

1) เหตุใดจึงมีข้อกำหนดความกว้าง / ความสูงในเวกเตอร์ที่วาดได้ ฉันคิดว่าจุดทั้งหมดของสิ่งเหล่านี้คือการขยายขนาดขึ้นและลงโดยไม่สูญเสียทำให้ความกว้างและความสูงไม่มีความหมายในคำจำกัดความ?

สำหรับ SDK เวอร์ชันที่น้อยกว่า 21 ที่ระบบบิลด์จำเป็นต้องสร้างอิมเมจแรสเตอร์และเป็นขนาดเริ่มต้นในกรณีที่คุณไม่ได้ระบุความกว้าง / ความสูง

2) เป็นไปได้หรือไม่ที่จะใช้เวกเตอร์ที่วาดได้ตัวเดียวซึ่งทำงานเป็น 24dp ที่วาดได้บน TextView รวมทั้งภาพที่มีความกว้างใกล้หน้าจอขนาดใหญ่

ฉันไม่เชื่อว่าจะเป็นไปได้หากคุณต้องการกำหนดเป้าหมาย SDK ที่น้อยกว่า 21

3) ฉันจะใช้แอตทริบิวต์ width / height ได้อย่างมีประสิทธิภาพอย่างไรและความแตกต่างกับ viewportWidth / Height คืออะไร?

เอกสารประกอบ: (ตอนนี้ไม่ค่อยมีประโยชน์ที่อ่านซ้ำ ... )

android:width

ใช้เพื่อกำหนดความกว้างที่แท้จริงของ drawable สิ่งนี้สนับสนุนหน่วยมิติทั้งหมดซึ่งปกติระบุด้วย dp

android:height

ใช้เพื่อกำหนดความสูงที่แท้จริงที่สามารถดึงได้ สิ่งนี้สนับสนุนหน่วยมิติทั้งหมดโดยปกติระบุด้วย dp

android:viewportWidth

ใช้เพื่อกำหนดความกว้างของพื้นที่วิวพอร์ต วิวพอร์ตเป็นพื้นที่เสมือนจริงที่มีการวาดเส้นทาง

android:viewportHeight

ใช้เพื่อกำหนดความสูงของพื้นที่วิวพอร์ต วิวพอร์ตเป็นพื้นที่เสมือนจริงที่มีการวาดเส้นทาง

เอกสารเพิ่มเติม:

Android 4.4 (API ระดับ 20) และต่ำกว่าไม่รองรับ vector drawables หากระดับ API ขั้นต่ำของคุณถูกตั้งไว้ที่ระดับ API ระดับใดระดับหนึ่ง Vector Asset Studio ยังสั่งให้ Gradle สร้างภาพแรสเตอร์ของเวกเตอร์ที่วาดได้สำหรับความเข้ากันได้แบบย้อนหลัง คุณสามารถอ้างถึงเนื้อหาเวกเตอร์Drawableในโค้ด Java หรือ@drawableในโค้ด XML เมื่อแอปของคุณทำงานเวกเตอร์หรือภาพแรสเตอร์ที่เกี่ยวข้องจะแสดงโดยอัตโนมัติขึ้นอยู่กับระดับ API


แก้ไข:มีบางอย่างแปลก ๆ เกิดขึ้น นี่คือผลลัพธ์ของฉันในโปรแกรมจำลอง SDK เวอร์ชัน 23 (อุปกรณ์ทดสอบ Lollipop + ตายแล้วในขณะนี้ ... ):

ระฆังดีเมื่อ 6.x

และในโปรแกรมจำลอง SDK เวอร์ชัน 21:

ระฆังเส็งเคร็งเมื่อ 5.x


1
ขอบคุณ Cory ฉันได้เห็นเอกสารนั้นและพบว่ามันไม่มีประโยชน์มากนัก อุปกรณ์ของฉันคือ Lollipop (v22) แต่ฉันไม่สามารถปรับขนาดกราฟิกได้ดีเหนือ 24dp ที่ระบุในเวกเตอร์ที่วาดได้ไม่ว่าจะระบุความสูง / น้ำหนักไว้ใน ImageView หรือไม่ก็ตาม ฉันได้ทดสอบรายการกับเป้าหมายและคอมไพล์ระดับ 23 และขั้นต่ำระดับ 21 แต่มันจะไม่เพิ่มสเกลเวกเตอร์ของฉันที่วาดได้อย่างราบรื่นโดยที่ฉันไม่เปลี่ยนความกว้าง / ความสูงในตัวดึงเอง ฉันไม่ต้องการสร้าง drawables หลาย ๆ อันที่มีความสูง / ความกว้างต่างกันเท่านั้น!
Chris Knight

1
ขอบคุณสำหรับการยืนยันและขอขอบคุณสำหรับความช่วยเหลือของคุณ ดังที่คุณได้แสดงให้เห็นชัดเจนว่าควรจะทำงานตามที่ฉันคาดหวังไว้ การใช้รหัสที่แน่นอนของคุณจะให้ผลลัพธ์เหมือนกับที่ฉันมีในตอนแรก น่าหงุดหงิด!
Chris Knight

1
อัปเดต: รันโค้ดของฉันกับอีมูเลเตอร์ด้วย API 22 และฉันก็ยังได้ผลลัพธ์เหมือนเดิม เรียกใช้รหัสของฉันกับโปรแกรมจำลองด้วย API 23 และ tada! มันใช้งานได้ ดูเหมือนว่าการลดขนาดจะทำงานบนอุปกรณ์ API 23+ เท่านั้น พยายามเปลี่ยนเวอร์ชัน SDK เป้าหมาย แต่ไม่ได้สร้างความแตกต่าง
Chris Knight

คุณพบวิธีแก้ปัญหานี้หรือไม่?
dazza5000

@corycharlton สามารถลบwidth height viewport heightและwidthออกได้xmlหรือไม่?
VINNUSAURUS

10

AppCompat 23.2 แนะนำ vector drawables สำหรับอุปกรณ์ทั้งหมดที่ใช้ Android 2.1 ขึ้นไป รูปภาพปรับขนาดได้อย่างถูกต้องโดยไม่คำนึงถึงความกว้าง / ความสูงที่ระบุในไฟล์ XML ของเวกเตอร์ที่วาดได้ ขออภัยการใช้งานนี้ไม่ได้ใช้ใน API ระดับ 21 ขึ้นไป (เพื่อสนับสนุนการใช้งานแบบเนทีฟ)

ข่าวดีก็คือเราสามารถบังคับให้ AppCompat ใช้การใช้งานบน API ระดับ 21 และ 22 ได้ข่าวร้ายคือเราต้องใช้การไตร่ตรองเพื่อทำสิ่งนี้

ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณใช้ AppCompat เวอร์ชันล่าสุดและคุณได้เปิดใช้งานการใช้งานเวกเตอร์ใหม่:

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

dependencies {
    compile 'com.android.support:appcompat-v7:23.2.0'
}

จากนั้นเรียกuseCompatVectorIfNeeded();ใช้ onCreate () ของแอปพลิเคชันของคุณ:

private void useCompatVectorIfNeeded() {
    int sdkInt = Build.VERSION.SDK_INT;
    if (sdkInt == 21 || sdkInt == 22) { //vector drawables scale correctly in API level 23
        try {
            AppCompatDrawableManager drawableManager = AppCompatDrawableManager.get();
            Class<?> inflateDelegateClass = Class.forName("android.support.v7.widget.AppCompatDrawableManager$InflateDelegate");
            Class<?> vdcInflateDelegateClass = Class.forName("android.support.v7.widget.AppCompatDrawableManager$VdcInflateDelegate");

            Constructor<?> constructor = vdcInflateDelegateClass.getDeclaredConstructor();
            constructor.setAccessible(true);
            Object vdcInflateDelegate = constructor.newInstance();

            Class<?> args[] = {String.class, inflateDelegateClass};
            Method addDelegate = AppCompatDrawableManager.class.getDeclaredMethod("addDelegate", args);
            addDelegate.setAccessible(true);
            addDelegate.invoke(drawableManager, "vector", vdcInflateDelegate);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

สุดท้ายตรวจสอบให้แน่ใจว่าคุณกำลังใช้app:srcCompatแทนandroid:srcการตั้งค่ารูปภาพของ ImageView:

<ImageView
    android:layout_width="400dp"
    android:layout_height="400dp"
    app:srcCompat="@drawable/icon_bell"/>

วาดเวกเตอร์ของคุณควรปรับขนาดอย่างถูกต้องแล้ว!


แนวทางที่ดี แต่ AppCompat 25.4 (และอาจจะก่อนหน้านี้) ให้ข้อผิดพลาดผ้าสำลี "สามารถเรียกได้จากกลุ่มไลบรารีเดียวกันเท่านั้น" เครื่องมือสร้างที่ฉันใช้ยังคงปล่อยให้สร้าง แต่ฉันไม่แน่ใจว่ามีผลรันไทม์หรือไม่ กำลังจะทดสอบ
androidguy

สามารถเรียกได้จากกลุ่มไลบรารีเดียวกันเท่านั้นลบข้อผิดพลาดนี้โดยการเพิ่ม: lintOptions {disable 'RestrictedApi'}
Usama Saeed US

6

1) เหตุใดจึงมีข้อกำหนดความกว้าง / ความสูงในเวกเตอร์ที่วาดได้ ฉันคิดว่าจุดทั้งหมดของสิ่งเหล่านี้คือการขยายขนาดขึ้นและลงโดยไม่สูญเสียทำให้ความกว้างและความสูงไม่มีความหมายในคำจำกัดความ?

นี่เป็นเพียงขนาดเริ่มต้นของเวกเตอร์ในกรณีที่คุณไม่ได้กำหนดไว้ในมุมมองเค้าโครง (เช่นคุณใช้เนื้อหาห่อสำหรับความสูงและความกว้างของมุมมองภาพของคุณ)

2) เป็นไปได้หรือไม่ที่จะใช้เวกเตอร์ที่วาดได้ตัวเดียวซึ่งทำงานเป็น 24dp ที่วาดได้บน TextView รวมทั้งภาพที่มีความกว้างใกล้หน้าจอขนาดใหญ่

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

3) ฉันจะใช้แอตทริบิวต์ width / height ได้อย่างมีประสิทธิภาพอย่างไรและความแตกต่างกับ viewportWidth / Height คืออะไร?

สิ่งนี้มีผลต่อวิธีการใช้ช่องว่างรอบเวกเตอร์ของคุณ เช่นคุณสามารถใช้มันเพื่อเปลี่ยน "แรงโน้มถ่วง" ของเวกเตอร์ภายในวิวพอร์ตทำให้เวกเตอร์มีระยะขอบเริ่มต้นปล่อยให้บางส่วนของเวกเตอร์ออกจากวิวพอร์ต ฯลฯ ... โดยปกติคุณจะตั้งค่าให้เหมือนกัน ขนาด.


ขอบคุณ Emiura ฉันสนใจว่าคุณทำขนาดการแสดงผลหลายขนาดให้สำเร็จได้อย่างไรโดยใช้ที่วาดได้เดียวกัน การใช้ 24dp drawable (เพื่อวัตถุประสงค์ในการทดสอบ) ฉันได้เปลี่ยน ImageView ของฉันให้มีความกว้างและความสูงที่ระบุไว้ที่ 400dp และเรียกใช้บนอุปกรณ์ Lollipop (v22) ของฉัน แต่ก็ยังแสดงผลได้ไม่ดีเช่นภาพที่ลดขนาดแบบแรสเตอร์แทนที่จะเป็นภาพเวกเตอร์ ยังเปลี่ยนไฟล์ Manifest ของฉันให้มีเป้าหมายและคอมไพล์เทียบกับเวอร์ชัน 23 และขั้นต่ำ 21 ไม่แตกต่างกัน
Chris Knight

ในกรณีนี้คุณจะต้องใช้ขนาดที่ใหญ่ที่สุดในเวกเตอร์ที่วาดได้จากนั้นระบุขนาด 24dp ในมุมมองข้อความของคุณ
emirua

ตอนนี้ฉันเห็นแล้วว่าคุณได้ภาพเบลอเมื่อคุณขยายโดยมีความแตกต่างอย่างมากระหว่างขนาดในเวกเตอร์ที่วาดได้และขนาดในเค้าโครงใน Lollipop อย่างไรก็ตามมันยังคงเรียบร้อยกว่ามากเพียงแค่ตั้งค่าขนาดที่ใหญ่ที่สุดแทนที่จะมีไฟล์จำนวนมากสำหรับขนาดหน้าจอที่แตกต่างกัน)
emirua

4

ฉันแก้ปัญหาของฉันเพียงแค่เปลี่ยนขนาดของภาพเวกเตอร์ ตั้งแต่แรกเป็นทรัพยากรเช่น:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="300"
    android:viewportWidth="300">

และฉันเปลี่ยนเป็น 150dp (ขนาดของ ImageView ในเลย์เอาต์ด้วยทรัพยากรเวกเตอร์นี้) เช่น:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="150dp"
    android:height="150dp"
    android:viewportHeight="300"
    android:viewportWidth="300">

มันทำงานให้ฉัน


ขอบคุณนี่ก็เพียงพอแล้วที่จะแก้ปัญหาบนแท็บเล็ตของฉันที่มันปรากฏเป็นพิกเซล
user2342558

3

ฉันต้องลองใช้วิธีเหล่านี้ แต่น่าเสียดายที่ไม่มีวิธีใดได้ผล ฉันพยายามfitXYในImageViewผมลองใช้app:srcCompatแต่ไม่สามารถแม้แต่จะใช้มัน แต่ฉันพบวิธีหลอกลวง:

ตั้ง Drawable เพื่อคุณbackgroundImageView

แต่จุดสำคัญของวิธีนี้คือมิติมุมมอง หากคุณImageViewมีขนาดไม่ถูกต้อง Drawable จะได้รับ Stretch PercentRelativeLayoutคุณต้องควบคุมมันในรุ่นก่อนอมยิ้มหรือใช้บางชม

หวังว่าจะเป็นประโยชน์


2

ขั้นแรก : นำเข้า svg ไปยัง drawble: (( https://www.learn2crack.com/2016/02/android-studio-svg.html ))

1- คลิกขวาที่โฟลเดอร์ที่วาดได้เลือกใหม่ -> สินทรัพย์เวกเตอร์

ป้อนคำอธิบายภาพที่นี่

2- Vector Asset Studio มีตัวเลือกให้คุณเลือกไอคอนวัสดุ inbuilt หรือไฟล์ svg ในเครื่องของคุณเอง คุณสามารถแทนที่ขนาดเริ่มต้นได้หากจำเป็น

ป้อนคำอธิบายภาพที่นี่

ประการที่สอง : หากคุณต้องการการสนับสนุนจาก Android API 7+ คุณต้องใช้ Android Support Library acording (( https://stackoverflow.com/a/44713221/1140304 ))

1- เพิ่ม

vectorDrawables.useSupportLibrary = true

ไปยังไฟล์ build.gradle ของคุณ

2- ใช้เนมสเปซในเลย์เอาต์ของคุณที่มี imageView:

xmlns:app="http://schemas.android.com/apk/res-auto"

สาม : ตั้งค่า imageView ด้วย android: scaleType = "fitXY" และใช้ app: srcCompat

 <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"
        app:srcCompat="@drawable/ic_menu" />

ประการที่สี่ : หากคุณต้องการตั้งค่า svg ในรหัส java คุณต้องเพิ่มบรรทัดด้านล่างใน oncreate methoed

 @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

โซลูชันของคุณทำงานบน API 21 ขึ้นไปหรือไม่ user3210008 ข้างต้นระบุว่าการใช้งานไม่ได้ใช้กับ API 21 ขึ้นไป
AJW

2

สำหรับฉันแล้วสาเหตุที่ทำให้เวกเตอร์ถูกแปลงเป็น png คือandroid:fillType="evenodd"แอตทริบิวต์ใน vector drawable ของฉัน เมื่อฉันลบการเกิดขึ้นทั้งหมดของแอตทริบิวต์นี้ใน drawable ของฉัน (สำหรับnonzeroประเภทการเติมเริ่มต้นที่ใช้กับเวกเตอร์) ครั้งต่อไปที่สร้างแอปทุกอย่างก็เรียบร้อยดี

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