Làm cách nào để thiết lập baselineAlign thành false cải thiện hiệu năng trong linearLayout?


218

Tôi mới xây dựng một số UI trong xml và Lint đưa ra cảnh báo cho tôi và nói sẽ đặt android: baselineAlign thành false để cải thiện hiệu suất trong ListView.

Các tài liệu cho các thay đổi Lint đã thêm cảnh báo này cho biết

Hiệu suất bố trí: Tìm tuyến tính với các trọng số mà bạn nên đặt android: baselineAlign = "false" để có hiệu suất tốt hơn và cũng tìm thấy các trường hợp bạn có trọng số lồng nhau có thể gây ra vấn đề về hiệu suất.

Ai đó có thể giải thích tại sao điều này cải thiện hiệu suất, đặc biệt là khi cân nặng có liên quan?

Câu trả lời:


165

Bằng cách cài đặt android:baselineAligned="false", bạn đang ngăn công việc làm thêm mà bố cục ứng dụng của bạn phải thực hiện để Căn chỉnh đường cơ sở của trẻ em; mà rõ ràng có thể làm tăng hiệu suất. (Ít hoạt động không cần thiết trên UI => Hiệu suất tốt hơn)


20
Đó là một phần rõ ràng. Những gì tôi đã cố gắng đạt được là tại sao điều này chỉ là một sự cải thiện hiệu suất khi cân nặng có liên quan?
Christopher Perry

185
Đường cơ sở là gì?
Matt

48
Thuật ngữ cơ bản xuất phát từ kiểu chữ. Đó là dòng chữ vô hình trong văn bản ngồi trên. vi.wikipedia.org/wiki/Baseline_%28typography%29
Zsolt Safrany

12
Vì vậy, nếu đó là một cải tiến hiệu suất, điều đó có nghĩa là công việc thường được thực hiện sẽ không còn được thực hiện nữa. Tác dụng phụ của việc này là gì? Công việc mà chúng ta hiện đang tránh có khả năng mang lại kết quả khác nhau không?
lhunath

30
@lhunath theo tài liệu, Mặc định được đặt thành đúng . điều này buộc đường cơ sở của bất kỳ văn bản UI nào phải liên kết với nhau. Ví dụ, hãy nghĩ về các nút, bạn có hai nút có cùng chiều rộng / chiều cao trên cùng một dòng nhưng một trong số chúng có văn bản dài hơn, vì baselineAlined="true", nút có văn bản dài hơn có thể di chuyển xung quanh để căn chỉnh văn bản của nó với các nút khác. Để có một ví dụ tốt hơn, hãy xem bài đăng này
Nima G

20

Làm thế nào android:baselineAligned="false" để giúp đỡ. Nó có thể không phải là câu trả lời nhưng giúp có được khái niệm.

Tôi vừa mới quản lý để có được 3 mục (biểu tượng, văn bản, nút) được căn giữa theo chiều dọc trong linearLayout ngang.

Điều này có vẻ đơn giản, nhưng trong thực tế chỉ định android: vity = "centre_vertical" vì thuộc tính linearLayout là không đủ - biểu tượng được căn giữa, nhưng văn bản và nút thì không. Điều này là do (có lẽ) văn bản có đường cơ sở và thuật toán định tâm sử dụng nó thay vì trung tâm dọc 'thực'. Nhưng điều tồi tệ hơn - nút (đi kèm với văn bản) được căn giữa bằng đường cơ sở của văn bản!

Chỉ định android: baselineAlign = "false" trong linearLayout sẽ tắt cái này và mọi thứ đều chính xác.


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/pl platform_frameworks_base/blob/master/core/java/android/widget/LinearLayout.java#L1093

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.