dp
зависит от показателей отображения устройства и не будет работать на всех устройствах без набора наложений, зависящих от плотности, однако вместо этого можно использовать px
.
К сожалению, простой метод округления, используемый TypedValue#complexToDimensionPixelSize()
, учитывает только неотрицательные значения:
final int res = (int)(f+0.5f);
if (res != 0) return res;
if (value == 0) return 0;
if (value > 0) return 1;
return -1;
Когда f (значение px) отрицательно, результат обычно округляется неправильно, потому что он всегда использует сложение. Следующие размеры в пикселях наблюдаются для отрицательных px
размеров:
0px = 0.0
-1px = -1.0
-2px = -1.0
-3px = -2.0
-4px = -3.0
-5px = -4.0
...
Я открыл проблему AOSP для этого метода:
TypedValue # complexToDimensionPixelSize () неправильно округляет отрицательные размеры
Учитывая это поведение, следующие значения будут работать на всех устройствах:
<dimen name="match_parent">-2px</dimen>
<dimen name="wrap_content">-3px</dimen>
Вы можете использовать -1px или -2px для match_parent, но wrap_content должно быть -3px. Любая комбинация работает на устройствах и эмуляторах.
На практике я обнаружил, что функция предварительного просмотра IntelliJ не отображает макеты, когда -1px используется для match_parent, и неправильно отображает -2px, как если бы это было "wrap_content", если на него ссылается другое измерение, например. <dimen name="my_width">@dimen/match_parent</dimen>
. Я открыл вопрос для IntelliJ IDEA:
Предварительный просмотр Android не может отображать layout_width = "- 1px"