View.setPadding принимает только в px, есть ли способ установитьPadding в dp?

94

Функция Android View.setPadding(int left, int top, int right, int bottom)принимает значения только в пикселях, но я хочу установить отступы в dp. Есть ли способ обойти это?

Шардж
источник

Ответы:

186

Прямо в код

    int padding_in_dp = 6;  // 6 dps
    final float scale = getResources().getDisplayMetrics().density;
    int padding_in_px = (int) (padding_in_dp * scale + 0.5f);
Лабиб Панампуллан
источник
1
Привет, у меня вопрос. Эта формула используется только для заполнения или чего-то еще? напр. поля или размеры прямоугольника?
emeraldhieu 09
4
Это формула для преобразования единиц dp в единицы пикселей . Вы можете использовать его где угодно
Лабиб Панампуллан
2
Я предполагаю, что getResources()это функция, наследуемая действием, но я пытаюсь использовать эти строки в настраиваемом адаптере просмотра списка. Как я могу это сделать, если не могу позвонить getResources()?
Майк Бакстер,
1
Из вашего адаптера просто выполните getContext (). GetResources (). GetDisplayMetrics (). Density;
Стив Г.
4
Есть где-нибудь объяснение "+ 0.5f"?
Xavier L.
100

Если вы определяете размер (в dp или чем-то еще) в XML-файле (что в любом случае лучше, по крайней мере, в большинстве случаев), вы можете получить его значение в пикселях, используя этот код:

context.getResources().getDimensionPixelSize(R.dimen.your_dimension_name)
Майкл Спарманн
источник
3

Есть лучший способ программно преобразовать значение в dp:

int value = 200;
int dpValue = (int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP,
            value,        
            context.getResources().getDisplayMetrics());

Затем примените dpValueк своему методу, например:setPadding(dpValue,dpValue,dpValue,dpValue);

Wapn
источник
0

У меня такая же проблема. Единственное решение, которое я нашел (это вам не очень поможет :)), - это установить его в файле Xml.

Если вы можете получить плотность из кода, вы можете использовать преобразование: «Преобразование единиц падения в пиксели экрана простое: пиксели = падения * (плотность / 160)». (из http://developer.android.com/guide/practices/screens_support.html )

Изменить: вы можете получить плотность экрана: http://developer.android.com/reference/android/util/DisplayMetrics.html#de densityDpi

Хецал
источник