Чи використовує setWidth (int pixels) dip або px?


95

Чи використовує setWidth (int pixels) незалежний від пристрою піксель або фізичний піксель як одиницю? Наприклад, чи встановлює setWidth (100) ширину подання до 100 занурень або 100 пікселів?

Дякую.

Відповіді:


221

Він використовує пікселі, але я впевнений, що вам цікаво, як замість цього використовувати падіння. Відповідь у TypedValue.applyDimension(). Ось приклад того, як перетворити dips у px у коді:

// 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 (). Щільність
Ромен Гай

9
Насправді це саме те, що робить TypedValue.applyDimension (). Я розглядав можливість опублікувати це, але мені подобається переглядати API на випадок, якщо щось коли-небудь зміниться ... хоча, мабуть, безпечно використовувати цей метод, якщо ви все в порядку. :)
Dan Lew,

12
Версія applyDimension () виконує більше коду, і мені стає важче прочитати. FWIW, рядок, який я опублікував, - це те, що ми насправді використовуємо повсюдно у фреймворку та стандартних програмах.
Ромен Гай

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.
Wayne Phipps

Ваше перше речення є якось смішним, ви в основному говорите, що створення XML-файлу є правильним способом "вказати [щось] у коді" . Ну, я думаю, ви просто використовуєте константу в коді, не вказуючи її :)
Джоффрі,

@Joffrey так, я розумію, що ти маєш на увазі, тому я трохи оновив формулювання
SDJMcHattie

7

Метод setWidth (100), встановіть 100 px як ширину (не в 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 layout, ми можемо вказати android: layout_width = "100dip" або android: layout_width = "100px". У вихідному коді ми не можемо вказати ширину макета як 100dip?
user256239

Не безпосередньо, вам доведеться конвертувати себе за допомогою DisplayMetrics.density.
Ромен Гай

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.