Как использовать масштабный коэффициент DPI (float) для установки полей (int)

1

Мое приложение Android отлично смотрится при разрешении 480x800 пикселей, но оно ломается на экране LDPI с разрешением 240x400 пикселей. Я знаю, что могу получить коэффициент масштабирования экрана в активности, используя getResources().getDisplayMetrics().density которая даст точное значение float зависимости от разрешения экрана.

В моем приложении я использовал RelativeLayout и ImageView внутри него и задавал поля изображений с помощью setMargins(), так как этот метод использует пиксели в int для своих верхних, левых, нижних и правых значений, как я могу установить эти значения с помощью DPI фактор, который я получил? (который является поплавком). У нас есть Math.floor() но я позиционирую изображения в очень определенных местах с использованием пикселей, а коэффициент DPI, возвращаемый методом, имеет очень специфическое значение в десятичных разрядах, которые нельзя игнорировать, поэтому приведение в int не работает для меня,

Обновить

Кроме того, я использую lp.setMargins(100,200,0,0); для установки полей, какую модификацию я буду делать в ней, чтобы использовать коэффициент DPI, который я получил от устройства?

PS Я знаю, что это скорее математическая проблема, чем программирование, но я беден с математикой, извините.

Теги:
compatibility
resolution
fragmentation

1 ответ

8
Лучший ответ

Похоже, я слишком рано задавал этот вопрос, вместо того, чтобы возиться с самим собой, но также заметил, что я НЕ ВСЕ, кто первым сталкивается с этой проблемой.

Итак, вот решение, которое я нашел.

В моем классе Activity я создал следующий метод.

private int px(float dips)
{
    float DP = getResources().getDisplayMetrics().density;
    return Math.round(dips * DP);
}

Это преобразует заданное значение dp в соответствующие пиксели. Вы можете сделать переменную DP используемую в методе глобальной, и инициализировать ее в вашем onCreate() а не в px(), чтобы onCreate() выполнение метода.

Применение:

lp.setMargins(px(100),px(200), 0, 0);

ИЛИ, если вы не создаете px() только для этого и имеете DP как глобальный.

lp.setMargins(100 * Math.round(DP), 200 * Math.round(DP), 0, 0);

Однако использование метода делает его более чистым и читаемым. :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню