Конвертировать пиксели в sp

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

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

3 ответа

Решение

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

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

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

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

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

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

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