L'appel de TextView.setTextSize()
fonctionne anormalement. Juste après l'appel à setTextSize
si nous obtenons une getTextSize
, sa valeur renvoyée est beaucoup plus élevée que celle définie précédemment
Voici ce que nous faisons:
zoomControl.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View view) {
float size = mViewShabad.getTextSize() + 1;
textView.setTextSize(size);
}
});
Quelqu'un a-t-il déjà vu cela avant?
La différence ici est que dans la méthode setTextSize(int size)
, le type d'unité est par défaut "sp" ou "pixels redimensionnés". Cette valeur sera une dimension de pixel différente pour chaque densité d'écran (ldpi, mdpi, hdpi).
getTextSize()
, en revanche, 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
ce problème est dû au fait que la méthode getTextSize()
renvoie la taille en pixels de la densité de l'écran Pour obtenir la taille réelle du texte, utilisez ceci:
DisplayMetrics metrics;
metrics = getApplicationContext().getResources().getDisplayMetrics();
float Textsize =myTextView.getTextSize()/metrics.density;
myTextView.setTextSize(Textsize+1);
j'espère que ça résoudra :)
si vous définissez le paramètre, changez la taille de la police (quelque chose qui cause une erreur d’affichage), vous pouvez procéder comme suit:
setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);
Lorsque nous essayons de définir un problème de programmation avec getTextSize (), setText () renvoie la valeur en px au lieu de sp/dp/dip et nous savons que 1sp/dp = 1,5px (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 to px: sp/dp puis remplacer cette valeur par 1.5f
means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f));
En bref, si vous voulez faire un zoom arrière sur votre taille de texte
float size = mViewShabad.getTextSize()*1.1f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
Étant donné que getTextSize () renvoie UNIT_PX, nous devrions utiliser UNIT_PX.
Ajouter un peu plus de saveur à cette réponse a également semé la confusion. Vous devriez pouvez insérer ce test dans n’importe quel test @RunWith(AndroidJUnit4.class)
que vous avez dans votre projet (vous devrez également ajouter les dimensions à votre fichier dimens.xml).
Note: Tous ces tests réussissent
@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());
}
}
Le grand avantage que j’ai trouvé est que TextView.setTextSize(float)
applique l’échelle de police , donc si vous transmettez une dimension déjà appelée SP au lieu de DP, elle recevra la police d’échelle deux fois .
Après longtemps frappé et finalement résolu comme ça
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
getResources().getDimension(R.dimen.textsize));
créer un dossier dimen comme ceci: res/values / dimensions.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="textsize">8sp</dimen>
</resources>