W jaki sposób ustawienie baselineAligned w celu uzyskania fałszywej poprawy wydajności w LinearLayout?

218

Właśnie budowałem interfejs użytkownika w xml, a Lint dał mi ostrzeżenie i powiedział, aby ustawić Androida: baselineAligned na false, aby poprawić wydajność w ListView.

Dokumenty dotyczące zmian Lint, które dodały to ostrzeżenie, mówią

Wydajność układu: Znajduje układy liniowe z wagami, w których należy ustawić Androida: baselineAligned = "false", aby uzyskać lepszą wydajność, a także wyszukuje przypadki zagnieżdżenia wag, które mogą powodować problemy z wydajnością.

Czy ktoś może wyjaśnić, dlaczego poprawia to wydajność, szczególnie gdy chodzi o wagę?

Christopher Perry
źródło

Odpowiedzi:

165

Ustawiając android:baselineAligned="false", zapobiegasz dodatkowej pracy związanej z układem aplikacji w celu wyrównania linii podstawowych dzieci; co może oczywiście zwiększyć wydajność. (Mniej niepotrzebnych operacji na interfejsie użytkownika => lepsza wydajność)

Nima G.
źródło
20
Ta część jest oczywista. Chciałem zrozumieć, dlaczego jest to tylko poprawa wydajności, gdy chodzi o wagę?
Christopher Perry
185
Co to jest linia bazowa?
Matt
48
Termin podstawowy pochodzi z typografii. To niewidoczne litery linii w tekście siedzą. en.wikipedia.org/wiki/Baseline_%28typography%29
Zsolt Safrany
12
Więc jeśli jest to poprawa wydajności, oznacza to, że zwykle wykonywana praca nie jest już wykonywana. Jakie są tego skutki uboczne? Czy praca, której teraz unikamy, może dawać różne wyniki?
lhunath,
30
@lhunath zgodnie z dokumentacją, wartość domyślna to true . wymusza to wyrównanie linii bazowej dowolnego tekstu interfejsu użytkownika. Pomyślmy na przykład o przyciskach, masz dwa przyciski o tej samej szerokości / wysokości w tej samej linii, ale jeden z nich ma dłuższy tekst, ponieważ baselineAlined="true"przycisk z dłuższym tekstem może w końcu się poruszyć, aby wyrównać tekst z innymi przyciskami. Aby uzyskać lepszy przykład, sprawdź ten post
Nima G
20

jak android:baselineAligned="false" pomoc. To może nie być odpowiedź, ale pomoc w uzyskaniu koncepcji.

Właśnie udało mi się uzyskać 3 elementy (ikona, tekst, przycisk) wyśrodkowane pionowo w poziomym układzie liniowym.

Może się to wydawać proste, ale w rzeczywistości określenie Androida: gravity = "center_vertical", ponieważ atrybut LinearLayout nie wystarczy - ikona jest wyśrodkowana, ale tekst i przycisk nie. Wynika to z faktu, że (przypuszczalnie) tekst ma linię bazową, a algorytm centrowania używa go zamiast „rzeczywistego” środka pionowego. Ale co gorsza - przycisk (znajdujący się obok tekstu) jest wyśrodkowany za pomocą linii bazowej tekstu!

Określenie Androida: baselineAligned = "false" w LinearLayout wyłącza to i wszystko poprawnie się wyśrodkowuje.

Zar E Ahmer
źródło
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

gotowana woda
źródło