การตั้งค่า baselineAligned เป็น false ปรับปรุงประสิทธิภาพใน LinearLayout อย่างไร


218

ฉันเพิ่งสร้าง UI ใน xml และ Lint ให้คำเตือนและบอกให้ตั้ง android: baselineAligned เป็น false เพื่อปรับปรุงประสิทธิภาพใน ListView

เอกสารสำหรับการเปลี่ยนผ้าสำลีที่เพิ่มคำเตือนนี้กล่าว

ประสิทธิภาพของรูปแบบ: ค้นหา LinearLayouts ด้วยน้ำหนักที่คุณควรตั้งค่า Android: baselineAligned = "false" เพื่อประสิทธิภาพที่ดีขึ้นและยังพบกรณีที่คุณมีน้ำหนักซ้อนกันซึ่งอาจทำให้เกิดปัญหาด้านประสิทธิภาพ

ใครสามารถอธิบายได้ว่าทำไมสิ่งนี้ถึงปรับปรุงประสิทธิภาพโดยเฉพาะเมื่อน้ำหนักมีส่วนร่วม

คำตอบ:


165

ด้วยการตั้งค่าandroid:baselineAligned="false"คุณจะป้องกันไม่ให้งานพิเศษที่เลย์เอาต์ของแอพของคุณทำเพื่อจัดแนวเส้นเขตแดนของเด็ก ซึ่งสามารถเพิ่มประสิทธิภาพได้อย่างชัดเจน (ลดการดำเนินการที่ไม่จำเป็นใน UI => ประสิทธิภาพที่ดีขึ้น)


20
ส่วนนั้นชัดเจน สิ่งที่ฉันพยายามทำคือทำไมนี่เป็นเพียงการปรับปรุงประสิทธิภาพเมื่อน้ำหนักมีส่วนเกี่ยวข้อง
Christopher Perry

185
พื้นฐานคืออะไร
Matt

48
คำพื้นฐานมาจากการพิมพ์ มันเป็นตัวอักษรบรรทัดที่มองไม่เห็นในข้อความนั่งบน en.wikipedia.org/wiki/Baseline_%28typography%29
Zsolt Safrany

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

30
@lhunath ตามเอกสารเริ่มต้นมีการตั้งค่าที่แท้จริง สิ่งนี้บังคับให้พื้นฐานของข้อความ UI ใด ๆ เพื่อจัดตำแหน่งตัวเองกับ eachother ตัวอย่างเช่นคิดถึงปุ่มคุณมีสองปุ่มที่มีความกว้าง / ความสูงเท่ากันในบรรทัดเดียวกัน แต่หนึ่งในนั้นมีข้อความที่ยาวกว่าเนื่องจากbaselineAlined="true"ปุ่มที่มีข้อความยาวสามารถเลื่อนไปมาเพื่อจัดเรียงข้อความกับปุ่มอื่นได้ สำหรับตัวอย่างที่ดีกว่าลองดูโพสต์นี้
Nima G

20

วิธีการandroid:baselineAligned="false" ช่วยเหลือ อาจไม่ใช่คำตอบ แต่ช่วยในการรับแนวคิด

ฉันเพิ่งจะได้รับ 3 รายการ (ไอคอน, ข้อความ, ปุ่ม) อยู่ตรงกลางในแนวตั้งในแนวนอน LinearLayout

สิ่งนี้อาจดูเรียบง่าย แต่ในความเป็นจริงที่ระบุ android: gravity = "center_vertical" เนื่องจากแอตทริบิวต์ LinearLayout ไม่เพียงพอ - ไอคอนอยู่กึ่งกลาง แต่ข้อความและปุ่มไม่ได้ นี่เป็นเพราะข้อความ (สันนิษฐานว่า) มีพื้นฐานและอัลกอริทึมการจัดกึ่งกลางใช้แทนการกึ่งกลางแนวตั้ง 'ของจริง' แต่สิ่งที่แย่กว่านั้นคือปุ่ม (ซึ่งอยู่ถัดจากข้อความ) อยู่ตรงกลางโดยใช้พื้นฐานของข้อความ!

การระบุ android: baselineAligned = "false" ใน LinearLayout จะปิดการทำงานนี้และทุกอย่างจะอยู่กึ่งกลางอย่างถูกต้อง


15
// Baseline alignment requires to measure widgets to obtain the
                // baseline offset (in particular for TextViews). The following
                // defeats the optimization mentioned above. Allow the child to
                // use as much space as it wants because we can shrink things
                // later (and re-measure).
                if (baselineAligned) {
                    final int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
                    child.measure(freeSpec, freeSpec);
                }

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/LinearLayout.java#L1093

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