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.