Почему вложенные веса плохо подходят для производительности? Альтернативы?
Я написал несколько файлов макетов, в которых я использовал атрибут layout_weight
для создания отношения между разными представлениями.
В какой-то момент я начинаю получать предупреждения lint о вложенных весах.
Итак, мне интересно, почему вложенные веса плохо относятся к производительности, и если есть более эффективный способ создать постоянное соотношение между размерами представления, которые могут использоваться для разных размеров экрана, и это не обязательно должно указывать много (по разным размерам экрана, я имею в виду).
Спасибо!
Ответы
Ответ 1
Вложенные веса плохи для производительности, потому что:
Весы макета требуют, чтобы виджет измерялся дважды. Когда LinearLayout с ненулевыми весами вложен внутри другого LinearLayout с ненулевыми весами, затем количество измерений экспоненциально возрастать.
Всегда лучше использовать RelativeLayout и настраивать ваше представление в соответствии с местами других представлений без использования определенных значений dpi.
Ответ 2
Обновление: Отличная новостная поддержка для поддержки андроидных процентов помогает решить нашу проблему производительности и вложенных беспорядочно взвешенных LinearLayout
compile 'com.android.support:percent:23.0.0'
Демо ЗДЕСЬ
Github ЗДЕСЬ
Рассмотрим этот простой макет, чтобы продемонстрировать то же самое.
![процент поддержки libray demo]()
<android.support.percent.PercentRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/fifty_huntv"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="#ff7acfff"
android:text="20% - 50%"
android:textColor="@android:color/white"
app:layout_heightPercent="20%"
app:layout_widthPercent="50%" />
<TextView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_toRightOf="@id/fifty_huntv"
android:background="#ffff5566"
android:text="80%-50%"
app:layout_heightPercent="80%"
app:layout_widthPercent="50%"
/>
</android.support.percent.PercentRelativeLayout>
Избегайте деградации производительности вложенных LinearLayout
с весами. Действительно удивительный!!!.
Ответ 3
Я думаю (и я, вероятно, буду пылким для этого), но опять же я думаю, что мой телефон имеет четырехъядерный процессор, чтобы конкурировать (если не полностью уничтожать) большинство людей на домашнем ПК.
Я также считаю, что этот вид аппаратных возможностей - будущее телефонов.
Итак, я прихожу к выводу, что до тех пор, пока вы не будете увлекаться гнездом (в MHO макет никогда не должен быть более 4 уровней в глубину, и если это вы, вероятно, ошибаетесь), ваш телефон меньше заботится о наличии весов.
Есть много вещей, которые вы можете сделать, которые будут иметь гораздо более далекий эффект на производительность, а затем беспокоиться о том, что ваш процессор выполняет некоторую дополнительную математику.
(обратите внимание, что я немного юмористичен и поэтому не воспринимаю что-либо слишком серьезно из этого поста, иначе идея о том, что есть другие вещи, которые вы должны сначала оптимизировать, и что беспокоиться о 2-3-уровневом глубоком весе не помогает вашему здоровью)
Ответ 4
Основная причина, почему вложенные веса плохи, заключается в том, что когда в макете есть дети с весом, ее нужно измерять дважды (я думаю, что это упоминается в предупреждении lint-warning). Это означает, что взвешенная компоновка, которая также содержит взвешенную компоновку, должна измеряться четыре раза, и каждый "уровень" весов, которые вы добавляете, увеличивает количество мер с силой в два.
В ICS (уровень API 14) добавлен GridLayout
, который позволяет использовать простые и "плоские" решения для многих макетов, которые ранее требовали весов. Если вы разрабатываете более ранние версии Android, вам будет немного сложнее удалить весы, но с помощью RelativeLayout
и сглаживания, насколько возможно, вашего макета в эту кабину, обычно удаляйте много вложенных весов.
Ответ 5
Я думаю, единственной альтернативой является создание функции, которая будет называться onResume и будет устанавливать все размеры и позиции. Во всяком случае, по весу вы можете устанавливать только размеры, но без дополнений (поэтому макеты становятся еще более сложными), no textSize (это невозможно как-то компенсировать), не говоря уже о таких вещах, как количество строк.