После некоторых экспериментов я думаю, что алгоритм для LinearLayout такой:
Предположим, что для weightSum
установлено значение. Случай отсутствия обсуждается позже.
Сначала разделите weightSum
на количество элементов с match_parent
или fill_parent
в измерении LinearLayout (например, layout_width
для orientation="horizontal"
). Мы назовем это значение множителем веса для каждого элемента. Значение по умолчанию для weightSum
равно 1,0, поэтому множитель веса по умолчанию равен 1/n
, где n
- количество элементов fill_parent
; wrap_content
элементы не влияют на n
.
например. когда weightSum
равно 60 и имеется 3 fill_parent
элементов, множитель веса равен 20. Умножитель веса является значением по умолчанию, например, например, layout_width
если атрибут отсутствует.
Во-вторых, максимально возможное расширение каждого элемента вычисляется. Во-первых, элементы wrap_content
вычисляются в соответствии с их содержимым. Их расширение вычитается из расширения родительского контейнера. Мы позвоним оставшемуся expansion_remainer
. Этот остаток распределяется среди fill_parent
элементов в соответствии с их layout_weight
.
В-третьих, расширение каждого элемента fill_parent
вычисляется как:
* +1039 * Пример:
Если weightSum
равно 60, и есть 3 fill_parent
элемента с весами 10, 20 и 30, их расширение на экране составляет 2/3, 1/3 и 0/3 родительского контейнера.
weight | expansion
0 | 3/3
10 | 2/3
20 | 1/3
30 | 0/3
40 | 0/3
Минимальное расширение ограничено 0. Максимальное расширение ограничено родительским размером, т.е. веса ограничены 0.
Если для элемента установлено значение wrap_content
, сначала рассчитывается его расширение, а оставшееся расширение подлежит распределению среди элементов fill_parent
. Если установлено значение weightSum
, это приведет к тому, что layout_weight
не повлияет на элементы wrap_content
.
Однако элементы wrap_content
могут по-прежнему выталкиваться из видимой области элементами, вес которых меньше (например, между 0-1 для weightSum
= 1 или между 0-20 для приведенного выше примера).
Если не указано weightSum
, оно вычисляется как сумма всех layout_weight
значений, , включая элементов с установленным wrap_content
! Таким образом, если layout_weight
установлено для wrap_content
элементов, может влиять на их расширение. Например. отрицательный вес сократит остальные fill_parent
элементов.
Перед размещением элементов fill_parent
приведенная выше формула будет применена к элементам wrap_content
, причем максимально возможное расширение будет их расширением в соответствии с упакованным содержимым. Элементы wrap_content
будут сжаты, после чего будет вычислено и распределено максимально возможное расширение для остальных элементов fill_parent
.
Это может привести к неинтуитивным результатам.