Какая единица измерения использует Paint.setTextSize(float)?

Я хочу нарисовать текст с определенной высотой (в пикселях) с помощью Canvas. Можете ли вы просто использовать Paint.setTextSize(float) с количеством пикселей или с помощью dp или sp?

Ответы

Ответ 1

Он использует пиксели, но вы можете преобразовать его в dp с помощью этого кода:

double getDPFromPixels(double pixels) {
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    switch(metrics.densityDpi){
     case DisplayMetrics.DENSITY_LOW:
                pixels = pixels * 0.75;
                break;
     case DisplayMetrics.DENSITY_MEDIUM:
                 //pixels = pixels * 1;
                 break;
     case DisplayMetrics.DENSITY_HIGH:
                 pixels = pixels * 1.5;
                 break;
    }
    return pixels;
}

Ответ 2

Самый простой способ получить значение px для таких методов - просто определить соответствующее значение dp или sp в файле dimens.xml и получить его следующим образом:

int sizeInPx = context.getResources().getDimensionPixelSize(R.dimen.sizeInSp);

На самом деле у вас есть 3 метода, которые можно использовать в зависимости от ваших потребностей:

  • getDimension() Возвращает float в пикселях.

  • getDimensionPixelSize() Возвращает int в пикселях. Это то же самое, что и getDimension(), за исключением того, что возвращаемое значение равно ROUNDED до ближайшего целочисленного значения и гарантирует, что ненулевое входное значение приведет к ненулевому выходному значению (например, 0,1 возвращается как 1, а не 0).

  • getDimensionPixelOffset() Возвращает int в пикселях. Это то же самое, что и getDimension(), за исключением того, что возвращаемое значение TRUNCATED (т.е. округлено вниз). Результат может быть равен нулю.

Ответ 3

Эти методы включают DisplayMetrics, которые можно добавить в будущий Android SDK.

Пикселы для окунания:

public static float getDipFromPixels(float px) {
        return TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_PX,
                px,
                Resources.getSystem().getDisplayMetrics()
        );
}

Dip to pixels:

public static float getPixelsFromDip(float dip) {
        return TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, 
                dip,
                Resources.getSystem().getDisplayMetrics()
        );
}