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( ) )

Другие вопросы по тегам