TextView.setTextSize ведет себя ненормально - как установить размер текстового изображения динамически для разных экранов
Вызов TextView.setTextSize()
работает ненормально. Сразу после вызова setTextSize
, если мы получим getTextSize
, он возвращает гораздо более высокое значение, чем мы его установили раньше.
Вот что мы делаем:
zoomControl.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View view) {
float size = mViewShabad.getTextSize() + 1;
textView.setTextSize(size);
}
});
Кто-нибудь видел это раньше?
Ответы
Ответ 1
Разница здесь в том, что в методе setTextSize(int size)
тип устройства по умолчанию - "sp" или "масштабированные пиксели". Это значение будет отличаться по размеру пикселей для каждой плотности экрана (ldpi, mdpi, hdpi).
getTextSize()
, с другой стороны, возвращает фактические размеры пикселя в тексте.
Вы можете использовать setTextSize(int unit, float size)
, чтобы указать тип единицы измерения. Константные значения для этого можно найти в классе TypedValue, но некоторые из них:
TypedValue.COMPLEX_UNIT_PX //Pixels
TypedValue.COMPLEX_UNIT_SP //Scaled Pixels
TypedValue.COMPLEX_UNIT_DIP //Device Independent Pixels
Ответ 2
эта проблема возникает, потому что метод getTextSize()
возвращает размер в пикселях в зависимости от плотности экрана! для получения Actual TextSize используйте это:
DisplayMetrics metrics;
metrics = getApplicationContext().getResources().getDisplayMetrics();
float Textsize =myTextView.getTextSize()/metrics.density;
myTextView.setTextSize(Textsize+1);
Надеюсь, он его решит:)
Ответ 3
Если параметр "Изменить размер шрифта для изменения", что-то вызывать ошибку show, вы можете сделать так:
setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);
Ответ 4
Когда мы пытаемся setText() запрограммировать проблему с getTextSize(), возвращает значение в px вместо sp/dp/dip, и мы знаем 1sp/dp = 1.5px (размер экрана = 240).
titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*1.5f));
работает отлично для меня, или мы можем использовать displaymatrix для px: sp/dp ratio, а затем заменить это значение на 1.5f
means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f));
Ответ 5
Короче говоря, если вы хотите уменьшить размер текста
float size = mViewShabad.getTextSize()*1.1f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
Поскольку getTextSize() возвращает UNIT_PX, мы должны использовать UNIT_PX
Ответ 6
Добавляя дополнительный вкус для этого ответа, также столкнулся с некоторой путаницей. Вы можете оставить этот тест в любом тесте @RunWith(AndroidJUnit4.class)
, который у вас есть в вашем проекте (вам также нужно будет добавить размеры к вашему dimens.xml).
Примечание. Все эти тесты проходят
@Test public void testScaledFontSizes() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
final Context context = InstrumentationRegistry.getTargetContext();
Configuration configuration = context.getResources().getConfiguration();
configuration.fontScale = 2.0f;
configuration.densityDpi = 160; // mdpi, 1:1
context.getResources().updateConfiguration(configuration, null);
float scaledTextSize = context.getResources().getDimensionPixelSize(R.dimen.sp_15);
assertEquals(30.0f, scaledTextSize);
// Create a new TextView with the explicitly set configuration
TextView textView = new TextView(context);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledTextSize);
// 30, because font size is scaled
assertEquals(30.0f, textView.getTextSize());
// This is what we *don't* want, it scaled *twice*!
textView.setTextSize(scaledTextSize);
assertEquals(60.0f, textView.getTextSize());
// DP instead of SP tests
float fifteenDp = context.getResources().getDimensionPixelSize(R.dimen.dp_15);
assertEquals(15.0f, fifteenDp);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, fifteenDp);
// Still 15, because it DP, not SP
assertEquals(15.0f, fifteenDp);
textView.setTextSize(fifteenDp);
// 30, because setTextSize DOES font scaling
assertEquals(30.0f, textView.getTextSize());
}
}
Большая выдержка, которую я обнаружил, заключается в том, что TextView.setTextSize(float)
применяет масштабирование шрифта, поэтому, если вы передадите размер, который уже помечен как SP вместо DP, тогда он дважды получит масштабирование шрифта.
Ответ 7
После долгого времени ударил это и наконец решил, как это
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
getResources().getDimension(R.dimen.textsize));
создайте папку измерений следующим образом: res/values /sizes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="textsize">8sp</dimen>
</resources>