TextView.setTextSize()
の呼び出しは異常に動作しています。 setTextSize
を呼び出した直後に、getTextSize
を取得した場合、以前に設定した値よりもはるかに高い値を返します。
これが私たちがやっていることです。
zoomControl.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View view) {
float size = mViewShabad.getTextSize() + 1;
textView.setTextSize(size);
}
});
誰もこれを見たことがありますか?
ここでの違いは、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
この問題は、getTextSize()
メソッドが画面密度に依存するピクセル単位のサイズを返すために発生しました。実際のTextSizeを取得するには、これを使用します。
DisplayMetrics metrics;
metrics = getApplicationContext().getResources().getDisplayMetrics();
float Textsize =myTextView.getTextSize()/metrics.density;
myTextView.setTextSize(Textsize+1);
私はそれがそれを解決することを望みます:)
フォントサイズの変更を設定する場合、何かがエラーを表示する場合、次のようにできます。
setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);
GetTextSize()でsetText()をプログラム的に問題にしようとすると、sp/dp/dipではなくpxで値を返し、1sp/dp = 1.5px(screen size = 240)を知っています。
titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*1.5f));
私のために完璧に働いているか、displaymatrix対px:sp/dp比を使用して、その値を1.5fに置き換えることができます
means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f));
要するに、テキストサイズを縮小したい場合
float size = mViewShabad.getTextSize()*1.1f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
GetTextSize()はUNIT_PXを返すため、UNIT_PXを使用する必要があります
長い間これを打って、最終的にこのように解決しました
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
getResources().getDimension(R.dimen.textsize));
このres/values/dimensions.xmlのようなdimenフォルダーを作成します
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="textsize">8sp</dimen>
</resources>
この答えにフレーバーを追加すると、少し混乱するようになりました。 shouldプロジェクトにある@RunWith(AndroidJUnit4.class)
テストにこのテストをドロップできます(dimensを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'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());
}
}
私が見つけた大きなポイントは、TextView.setTextSize(float)
フォントのスケーリングを適用するであるため、DPではなくSPと既にラベル付けされたdimen thatを渡すと、フォントのスケーリングtwice。