setTextSize - устанавливает размер текста больше ожидаемого

Я использую этот код, чтобы увеличить текст на один sp, но он слишком сильно увеличивает размер...

public void doThis(MenuItem item){
        size = text.getTextSize();
        text.setTextSize(TypedValue.COMPLEX_UNIT_SP, (float) (size + 1));

    }

Я хочу, чтобы он добавил только один sp...

Спасибо за помощь


person Max    schedule 06.04.2014    source источник


Ответы (3)


Поскольку вы получаете свой размер в пикселях и используете его для перевода в sp. Сначала вам нужно преобразовать размер обратно в sp:

float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
float sizeNew = text.getTextSize() / scaledDensity; // obtain current size in sp
sizeNew += 1f; // add 1 sp
text.setTextSize(TypedValue.COMPLEX_UNIT_SP, sizeNew); // set new size in sp
person Alex Salauyou    schedule 06.04.2014
comment
@Vyger и только тогда, когда в настройках пользователя установлено нормальное масштабирование текста. - person Alex Salauyou; 06.04.2014

Вы получаете пиксели вместо sp от getTextSize();

Попробуй это:

text.setTextSize(TypedValue.COMPLEX_UNIT_SP, (text.getSize() / getResources().getDisplayMetrics().scaledDensity) + 1);
person Dan Harms    schedule 06.04.2014
comment
вам нужно добавить приведение к float, иначе значение может быть неправильным - person Alex Salauyou; 06.04.2014
comment
извините, я ошибаюсь... getTextSize() возвращает float, а не int. Так что кастинг не нужен. - person Alex Salauyou; 06.04.2014
comment
Ха-ха, я даже не удосужился посмотреть это после вашего комментария, я не должен был быть таким доверчивым ... :) - person Dan Harms; 06.04.2014

Вы можете использовать эту функцию, чтобы изменить пиксели на sp, вы можете увидеть весь поток здесь

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

}

person César Cobo    schedule 06.04.2014