Преобразование пикселей в sp

Мне нужно текущее TextSize из TextView в sp единицах.

Но getTextSize() возвращает размер в pixels. Так есть ли способ convert pixels to sp?


person Nital    schedule 07.06.2011    source источник
comment
См. также этот ответ для конверсий DP -> PX, PX -> DP, SP to PX и PX to SP.   -  person Suragch    schedule 08.02.2017


Ответы (3)


См. класс DisplayMetrics, в нем есть поля для densityDpi и scaledDensity.

Пример использования:

float sp = px / getResources().getDisplayMetrics().scaledDensity;
person Gabriel Negut    schedule 07.06.2011
comment
Просто поясню: класс DisplayMetrics имеет поля densityDpi и scaledDensity, а не методы. А для масштабирования лучше использовать поле density, а не densityDpi. - person Ted Hopp; 12.04.2016
comment
Пожалуйста, ответьте на заданный вопрос. Произнесение имени класса, которое можно использовать для ответа, само по себе не является ответом. - person Megakoresh; 16.12.2016
comment
Этот мне помог ???? - person mustafiz012; 18.03.2019

Использовать это

public static float pixelsToSp(Context context, float px) {
    float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
    return px/scaledDensity;
}

Если вы хотите проверить, правильно ли работает этот метод, используйте этот фрагмент

XML

<TextView
        android:id="@+id/txtHelloWorld"
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>

<TextView
        android:id="@+id/txtHelloWorld2"
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

Ява

View rootView = inflater.inflate(R.layout.fragment_main, container, false);
TextView helloWorldTextView = (TextView)    rootView.findViewById(R.id.txtHelloWorld);
TextView helloWorldTextView2 = (TextView) rootView.findViewById(R.id.txtHelloWorld2);
helloWorldTextView2.setTextSize(pixelsToSp(getActivity(), helloWorldTextView.getTextSize()));

Оба размера шрифта TextView должны быть одинаковыми.

person sealskej    schedule 09.02.2012

странно видеть общедоступное поле, которое настраивается во время выполнения, но оно работает. Стандартное значение Dpi равно 160, поэтому каким бы ни было разрешение вашего устройства, скажем, 240, плотность и масштабируемая плотность будут показывать 240/160 = 1,5 Вот как вы конвертируете между пикселями и sp: px = 1,5 * sp

person Vlad    schedule 16.12.2012