Jetpack Compose: почему LocalConfiguration.current.screenWidthDp — это Int, а не Float?
Кажется, что Int делает преобразования из dp в пиксели менее точными.
Например, для устройства с плотностью 420 и шириной в пикселях 1080 ширина в dp = 1080 * 160/420 = 411,4285714.
Однако, если вы вычислите из dp в пиксели, используя Int 411 или 412, тогда пиксели будут 1078,875 или 1081,5. Вы не можете сделать простой раунд, чтобы получить 1080 из этих чисел.
Предпочитают ли большинство вариантов использования это
1 ответ
LocalConfiguration.current
представляет собой CompositionLocal , который предоставляет платформуConfiguration
. Проще говоря, вы можете думать об этом как о параметре, который автоматически передается каждому из ваших составных объектов, о котором знает среда выполнения, чтобы перекомпоновать его при изменении. В этом смысле это значение является целым, поскольку оно представляет целое значение screenWidthDp конфигурации .
Причина, по которой он представлен как int на уровне платформы, заключается в том, что это всегда будет положительное целочисленное значение, поскольку именно оно используется для определения правильных ресурсов для использования в данной конфигурации. Другими словами, квалификаторы ресурсов имеют дело с целочисленными значениями, поэтому конфигурация предоставляет целочисленные значения.
Если вы хотите сделать что-то вроде рисования линии по всей ширине компонента, вы все время будете работать в пикселях. Пиксели, не зависящие от плотности, в этом случае не имеют смысла, потому что вас не волнует физический размер линии. Сравните это со случаем чего-то вроде кнопки, где физический размер имеет значение, поскольку он должен быть примерно размером с палец или больше (~48 dp +).
В тех случаях, когда вам важен физический размер, вы должны начать с dp и преобразовать в пиксели, когда вам нужно выполнить фактическое рисование (обычно просто используя что-то вроде 16.dp.toPx( ) )