TextView.setTextSize se comporte anormalement - comment définir dynamiquement la taille du texte de textview pour différents écrans

appeler TextView.setTextSize() fonctionne anormalement. Juste après l'appel à setTextSize si nous obtenons un getTextSize son retour une valeur beaucoup plus élevée que ce que nous avons fixé à plus tôt.

voilà ce que nous faisons:

zoomControl.setOnZoomInClickListener(new OnClickListener() {
    public void onClick(View view) {
        float size = mViewShabad.getTextSize() + 1;
        textView.setTextSize(size);
    }
});

quelqu'un a déjà vu ça?

104
demandé sur Cœur 2010-09-10 22:02:25

6 réponses

la différence ici est que dans la méthode setTextSize(int size) , le type d'unité par défaut est" sp "ou"pixels gradués". Cette valeur sera une dimension de pixel différente pour chaque densité d'écran (ldpi, mdpi, hdpi).

getTextSize() , d'autre part, renvoie les dimensions réelles en pixels du texte.

Vous pouvez utiliser setTextSize(int unit, float size) pour spécifier un type d'unité. Les valeurs constantes pour cela peuvent être trouvées dans la classe TypedValue, mais certaines d'entre elles sont:

TypedValue.COMPLEX_UNIT_PX   //Pixels

TypedValue.COMPLEX_UNIT_SP   //Scaled Pixels

TypedValue.COMPLEX_UNIT_DIP  //Device Independent Pixels
332
répondu kcoppock 2012-08-22 19:00:05

ce problème se produit parce que la méthode getTextSize() renvoie la taille en pixels en fonction de la densité de l'écran ! pour obtenir le TextSize réel utiliser ceci:

DisplayMetrics metrics;
metrics = getApplicationContext().getResources().getDisplayMetrics();
float Textsize =myTextView.getTextSize()/metrics.density;
myTextView.setTextSize(Textsize+1);

j'espère qu'il le résoudre :)

15
répondu M_AWADI 2012-12-29 02:03:20

si vous changez la taille de la police, quelque chose cause montrer l'erreur, vous pouvez le faire comme:"

setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);
7
répondu hui 谁与争辉 2015-02-03 08:09:04

lorsque nous essayons de régler programmatiquement gettext() avec getTextSize(), renvoie la valeur dans px au lieu de sp/dp/dip et nous savons que 1sp/dp=1.5 px(taille de l'écran =240).

 titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*1.5f)); 

fonctionne parfaitement pour moi, ou nous pouvons utiliser displaymatrix px:sp/dp ratio puis remplacer cette valeur avec 1,5 f

means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f));
3
répondu ranjan 2015-05-15 11:49:11

en bref, si vous voulez zoomer sur votre taille de texte

float size = mViewShabad.getTextSize()*1.1f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);

parce que getTextSize () retourne UNIT_PX, alors nous devrions utiliser UNIT_PX

1
répondu Frank Nguyen 2016-06-07 08:00:21

ajoutant un peu de saveur supplémentaire pour cette réponse, comme a également couru dans un peu de confusion. Vous devrait être en mesure de déposer ce test dans n'importe quel @RunWith(AndroidJUnit4.class) test que vous avez dans votre projet (vous aurez également besoin d'ajouter les dimensions à vos dimensions.XML.)

Note: Tous ces essais ont réussi

@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's 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's DP, not SP
    assertEquals(15.0f, fifteenDp);

    textView.setTextSize(fifteenDp);
    // 30, because setTextSize DOES font scaling
    assertEquals(30.0f, textView.getTextSize());
  }
}

la grande surprise que j'ai trouvé est que TextView.setTextSize(float) applique la police d'échelle , donc si vous passer dans un dimen thats déjà étiqueté comme SP au lieu de DP, puis il recevra la police d'échelle deux fois .

0
répondu Kevin Grant 2017-03-27 19:59:36