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>