BaselineAligned öğesini false değerine ayarlamak, LinearLayout'ta performansı nasıl geliştirir?


218

Ben sadece xml bazı UI inşa edildi ve Lint bana bir uyarı verdi ve android ayarlamak için dedi: baselineAligned ListView performansını artırmak için yanlış.

Lint değişikliklerine ilişkin bu uyarıyı ekleyen dokümanlar

Yerleşim performansı: Daha iyi performans için android: baselineAligned = "false" ayarlamanız gereken ağırlıklara sahip LinearLayouts'u bulur ve performans sorunlarına neden olabilecek iç içe ağırlıklara sahip vakaları da bulur.

Birisi, bunun özellikle kilo alındığında neden performansı iyileştirdiğini açıklayabilir mi?

Yanıtlar:


165

Ayarlayarak android:baselineAligned="false", uygulamanızın çocuklarının temel çizgilerini hizalamak için düzeninin yapması gereken ekstra işi önlersiniz; bu da performansı artırabilir. (Kullanıcı arayüzünde daha az gereksiz işlemler => Daha iyi performans)


20
Bu kısım açıktır. Anlamaya çalıştığım şey, bu sadece kilo olduğunda neden bir performans iyileştirmesi?
— Christopher Perry

185
Taban çizgisi nedir?
— Matt

48
Taban çizgisi terimi tipografiden gelir. Metinde görünmeyen çizgi harfleri oturmak. en.wikipedia.org/wiki/Baseline_%28typography%29
— Zsolt Safrany

12
Yani bu bir performans iyileştirmesi ise, normalde yapılan işlerin artık yapılmadığı anlamına gelir. Bunun yan etkileri nelerdir? Şu anda kaçındığımız iş farklı sonuçlar verebiliyor mu?
— lhunath

30
@lhunath belgelere göre, Varsayılan true olarak ayarlanmıştır . bu, herhangi bir UI metninin taban çizgisini birbirleriyle hizalamaya zorlar. Örneğin düğmeleri düşünün, aynı satırda aynı genişlik / yüksekliğe sahip iki baselineAlined="true"düğmeniz var, ancak bunlardan birinin daha uzun bir metni var, çünkü daha uzun metne sahip düğme, metnini diğer düğmelerle hizalamak için hareket edebilir. Daha iyi bir örnek için, bu
— yazıyı

20

nasıl android:baselineAligned="false" yardım. Cevap olmayabilir, ancak kavram edinmeye yardımcı olabilir.

Sadece yatay LinearLayout'ta dikey olarak ortalanmış 3 öğeyi (simge, metin, düğme) almayı başardım.

Bu basit görünebilir, ancak gerçekte android'i belirtmek: LinearLayout özniteliği olarak gravity = "center_vertical" yeterli değildir - simge ortalanır, ancak metin ve düğme değildir. Çünkü (muhtemelen) metnin bir taban çizgisi vardır ve merkezleme algoritması 'gerçek' dikey merkez yerine metni kullanır. Ama daha da kötüsü - düğme (metnin yanına gelir) metnin taban çizgisi kullanılarak ortalanır!

LinearLayout'ta android: baselineAligned = "false" belirtilmesi bunu kapatır ve her şey doğru şekilde merkezlenir.


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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.