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

Мне нужен ток TextSize для TextView в sp.

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

Ответ 1

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

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

float sp = px / getResources().getDisplayMetrics().scaledDensity;

Ответ 2

Используйте этот

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"
        />

Java

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 должны быть одинаковыми.

Ответ 3

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