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

95

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

Спасибо.

user256239
источник

Ответы:

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

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

SDJMcHattie
источник
В моей ситуации это решение работает лучше всего, когда у меня есть настраиваемый диалог со списком, и я хочу установить одинаковую ширину меток заголовков и столбцов в 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

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

Josnidhin
источник
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());
    }
Абхишек Гарг
источник