Quindi ho un dispositivo Android 2.3.5 che è NORMAL/HDPI. Ho un dimens.xml nel mio progetto:getDimension()/getDimensionPixelSize() - numero del moltiplicatore
...
<dimen name="gameresult_congrats_label_msg_textSize">20sp</dimen>
...
questo file è assolutamente identico nei valori-normali/valori-hdpi e così via cartelle. Nella mia prima attività app mi dimostra che valore utilizzando:
Toast.makeText(this, "textSize is "+getResources().getDimensionPixelSize(R.dimen.gameresult_congrats_label_msg_textSize), Toast.LENGTH_SHORT).show();
e vengono visualizzate 30. I Tried anche:
Toast.makeText(this, "textSize is "+getResources().getDimension(R.dimen.gameresult_congrats_label_msg_textSize), Toast.LENGTH_SHORT).show();
ma risultato è lo stesso. Ma solo quando ho provato questo:
Toast.makeText(this, "textSize is "+getResources().getString(R.dimen.gameresult_congrats_label_msg_textSize), Toast.LENGTH_SHORT).show();
Ho finalmente il mio "20sp"! Ma perché è così? Official docs says that those methods restituisce
Valore della dimensione risorsa moltiplicato per la metrica appropriata.
Ho verificato ciò cambiando il mio valore a 25 e ho ottenuto 38 il che significa che aos usa moltiplicatore 1.5. Ma perché? Ottiene già valore dalla cartella appropriata, il che significa che ottiene un valore pronto all'uso! Da dove viene ottenuto quel moltiplicatore 1.5x? So che dipende da DisplayMetrics. Ma come calcola 1.5x?
UPDATE
Capisco del moltiplicatore ma, vedete, il vero problema riguarda il doppio ridimensionamento. E questo è il motivo per cui ho fatto questa domanda.
Quindi, se ho qualche layout.xml (in res \ cartella di layout) con TexView definito come:
<TextView
android:id="@+id/congratsLabel"
...
android:textSize="@dimen/gameresult_congrats_label_msg_textSize" />
Tutto sembra ok. Intendo che la visualizzazione del testo è come mi aspetto.
Ora lascia fare la stessa cosa in codice:
TextView congratsLabel = fineViewById(R.id.congratsLabel);
textSize = getResources().getDimension(R.dimen.gameresult_congrats_label_msg_textSize)
congratsLabel.setTextSize(textSize)
e qui è il problema !!! getResources(). getDimension() restituisce un valore SCALED e questo è ok. Ma la dimensione risultante del mio textView sarà maggiore di 1.5 rispetto a quanto mi aspetto cuec setTextSize funziona con SP e qui arriva la seconda scala! Ed ecco perché AOS rende le dimensioni del testo risultanti ridimensionate a 45 (originariamente definite come 20sp).
'setTextSize()' accetta un parametro 'int' aggiuntivo che specifica il tipo di dimensione' float'. Ad esempio, per il valore di dimensione già ridimensionato, utilizzare 'TypedValue.COMPLEX_UNIT_PX'. – laalto