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

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

Благодарю.

7 ответов

Решение

Он использует пиксели, но я уверен, что вам интересно, как использовать провалы вместо этого. Ответ в 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()));

Правильный способ получить постоянное количество 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));

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

Метод 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());
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;

Источник (@Romain Guy)

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

   // 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());
    }

Функция расширения Kotlin для преобразования пикселей в dp

      fun Context.pxToDp(value: Float):Int{
    val r: Resources = resources
    return TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP, value, r.displayMetrics
    ).roundToInt()
}

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

Другие вопросы по тегам