TextView.setTextSize가 비정상적으로 작동 함-다른 화면에 대해 textview의 텍스트 크기를 동적으로 설정하는 방법
통화 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"또는 "scaled pixels"이라는 것입니다. 이 값은 각 화면 밀도 (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 ()와 프로그래밍 방식으로 문제가있는 text ()를 설정하려고하면 sp / dp / dip 대신 px로 값을 반환하고 1sp / dp = 1.5px (화면 크기 = 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>
Adding some extra flavor for this answer, as also ran into a bit of confusion. You should be able to drop this test into any @RunWith(AndroidJUnit4.class)
test you have in your project (you'll also need to add the dimens to your dimens.xml).
Note: All these tests pass
@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());
}
}
The big takeaway I found is that TextView.setTextSize(float)
applies the font scaling, so if you pass in a dimen thats already labelled as SP instead of DP, then it will receive the font scaling twice.
'IT박스' 카테고리의 다른 글
C #에서 foreach 루프를 벗어나려면 어떻게해야합니까? (0) | 2020.07.22 |
---|---|
프로그래밍 방식으로 탐색 모음의 UIBarButtonItem? (0) | 2020.07.22 |
다음 클래스를 찾을 수 없습니다 : android.support.v7.internal.app.WindowDecorActionBar (0) | 2020.07.22 |
EJB 3.1과 CDI는 어디에 사용합니까? (0) | 2020.07.22 |
Qt Creator-프로젝트 오류 : Xcode가 올바르게 설정되지 않았습니다. (0) | 2020.07.22 |