Использует ли setWidth (int пикселей) dip или px?


95

Использует ли setWidth (int пикселей) независимый от устройства пиксель или физический пиксель в качестве единицы? Например, устанавливает ли setWidth (100) ширину представления 100 или 100 пикселей?

Спасибо.

Ответы:


222

Он использует пиксели, но я уверен, что вам интересно, как вместо этого использовать провалы. Ответ в TypedValue.applyDimension(). Вот пример того, как преобразовать провалы в пиксели в коде:

// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));

64
Вы также можете вызвать nbDips * getResources (). GetDisplayMetrics (). Density
Ромен Гай,

9
Фактически, это именно то, что делает TypedValue.applyDimension (). Я подумывал опубликовать это, но мне нравится проходить через API на случай, если что-то когда-нибудь изменится ... хотя я думаю, что использовать этот метод безопасно, если вы дадите ему согласие. :)
Дэн Лью

12
Версия applyDimension () выполняет больше кода, и я считаю, что ее немного сложнее читать. FWIW, опубликованная мною строка - это то, что мы фактически используем повсюду во фреймворке и стандартных приложениях.
Romain Guy

1
Привет, я попробовал два приведенных выше примера, и похоже, что пиксели вычисляются неправильно. вместо этого он возвращает мне точное значение, указанное в моем представлении: android: layout_width = "50dip" в моем случае. он вернет мне 50 точных значений в файле xml. Затем я проверил это в приложении, и, как и ожидалось, значение неверно и изображение слишком велико, чем ожидалось
Джонатан

Единственное решение, которое я нашел для преобразования px в pt, очень хорошее.
A-Live

24

Правильный способ получить постоянное количество DIP в коде - создать XML-файл ресурсов, содержащий значения dp, примерно такие:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="image_width">100dp</dimen>
    <dimen name="image_height">75dp</dimen>
</resources>

Затем обратитесь к ресурсу в своем коде следующим образом:

float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));

Возвращенное число с плавающей запятой будет масштабировано в соответствии с плотностью пикселей устройства, поэтому вам не нужно повторять метод преобразования во всем приложении.


В моей ситуации это решение работает лучше всего, когда у меня есть настраиваемый диалог со списком, и я хочу установить одинаковую ширину меток заголовков и столбцов в ListView.
Уэйн Фиппс

Ваше первое предложение довольно забавное, вы в основном говорите, что создание файла XML - это правильный способ «указать [что-то] в коде» . Что ж, я думаю, вы просто используете константу в коде, а не указываете ее :)
Джоффри

@Joffrey да, я понимаю, что вы имеете в виду, поэтому я немного обновил формулировку
SDJMcHattie

7

Метод setWidth (100), установите ширину 100 пикселей (не в dp). Таким образом, вы можете столкнуться с проблемами с разной шириной на разных телефонах Android. Поэтому используйте измерение в dp вместо пикселей. Используйте приведенный ниже код, чтобы получить измерение в dp ширины образца. = 300 пикселей и высота = 400 пикселей.

int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());

int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());


0

Пиксели, конечно, метод запрашивает пиксели в качестве параметра.


1
Если он находится в XML-файле макета, мы можем указать android: layout_width = "100dip" или android: layout_width = "100px". В исходном коде мы не можем указать ширину макета как 100dip?
user256239 09

Не напрямую, вам нужно преобразовать себя с помощью DisplayMetrics.de density.
Romain Guy

0

Основываясь на приведенных выше ответах, которые мне подходят, я создаю несколько вспомогательных методов , просто добавляю их в свои утилиты, чтобы использовать их во всем проекте.

   // value in DP
   public static int getValueInDP(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInDP(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    // value in PX
    public static int getValueInPixel(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInPixel(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.