Bagaimana pengaturan baselineAligned to false meningkatkan kinerja di LinearLayout?

218

Saya baru saja membangun beberapa UI di xml, dan Lint memberi saya peringatan dan berkata untuk mengatur android: baselineAligned to false untuk meningkatkan kinerja di ListView.

Dokumen untuk Lint berubah yang menambahkan kata peringatan ini

Kinerja tata letak: Menemukan LinearLayout dengan bobot di mana Anda harus mengatur android: baselineAligned = "false" untuk kinerja yang lebih baik, dan juga menemukan kasus di mana Anda memiliki bobot bersarang yang dapat menyebabkan masalah kinerja.

Adakah yang bisa menjelaskan mengapa ini meningkatkan kinerja, khususnya ketika berat badan terlibat?

Christopher Perry
sumber

Jawaban:

165

Dengan menetapkan android:baselineAligned="false", Anda mencegah pekerjaan ekstra yang harus dilakukan tata letak aplikasi Anda untuk menyelaraskan garis dasar anak-anaknya; yang jelas dapat meningkatkan kinerja. (Lebih sedikit operasi yang tidak perlu pada UI => Kinerja yang lebih baik)

Nima G
sumber
20
Bagian itu sudah jelas. Apa yang saya coba mengerti adalah mengapa ini hanya peningkatan kinerja ketika berat badan terlibat?
Christopher Perry
185
Apa itu baseline?
Matt
48
Istilah baseline berasal dari tipografi. Ini adalah huruf-huruf garis yang tidak terlihat dalam teks. en.wikipedia.org/wiki/Baseline_%28typography%29
Zsolt Safrany
12
Jadi jika ini merupakan peningkatan kinerja, itu berarti pekerjaan yang biasanya dilakukan tidak dilakukan lagi. Apa efek samping dari ini? Apakah pekerjaan yang kita hindari sekarang memiliki kemampuan menghasilkan hasil yang berbeda?
lhunath
30
@ lhunath menurut dokumentasi, Defaultnya disetel ke true . ini memaksa garis dasar teks UI apa pun untuk menyelaraskan diri dengan satu sama lain. Misalnya pikirkan tentang tombol, Anda memiliki dua tombol dengan lebar / tinggi yang sama pada baris yang sama tetapi salah satunya memiliki teks yang lebih panjang, karena baselineAlined="true", tombol dengan teks yang lebih panjang dapat bergerak untuk menyelaraskan teksnya dengan tombol lain. Untuk contoh yang lebih baik, lihat pos ini
Nima G
20

bagaimana android:baselineAligned="false" membantu Ini mungkin bukan jawaban tetapi membantu untuk mendapatkan konsep.

Saya baru saja berhasil mendapatkan 3 item (ikon, teks, tombol) yang dipusatkan secara vertikal di LinearLayout horizontal.

Ini mungkin tampak sederhana, tetapi dalam kenyataannya menentukan android: gravity = "center_vertical" karena atribut LinearLayout tidak cukup - ikon terpusat, tetapi teks dan tombol tidak. Ini karena (mungkin) teks memiliki garis dasar, dan algoritma pemusatan menggunakannya bukan pusat vertikal 'nyata'. Tapi apa yang lebih buruk - tombol (yang muncul di sebelah teks) dipusatkan menggunakan garis dasar teks!

Menentukan android: baselineAligned = "false" di LinearLayout mematikan ini, dan semuanya terpusat dengan benar.

Zar E Ahmer
sumber
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

air mendidih
sumber