Java 코드를 사용하여 sp 값으로 텍스트 크기를 지정하는 방법


205

TextViewJava 코드를 사용하여 특정 텍스트 크기를 변경하기 위해 정수 값을 할당하면 값이 픽셀 ( px) 로 해석됩니다 .

이제 누구나 그것을 할당하는 방법을 알고 sp있습니까?

답변:


535

18
SP는 크기 조정 된 픽셀 을 나타내므로 화면 밀도별로 크기를 줄여야합니다. 다음과 같이 쉽게 수행 할 수 있습니다. SCREEN_DENSITY = getResources (). getDisplayMetrics (). density; yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (desiredTextHeightInSP / SCREEN_DENSITY);
PeteH

4
리소스에서 SP를 수집하려고 할 때 솔루션이 작동하지 않았습니다. PeteH, 당신은 나를 올바른 길로 데려 갔다! 다음은 나를 위해 속임수를 쓴 것입니다. ... float textSize = getResources (). getDimension (R.dimen.textsize) / getResources (). getDisplayMetrics (). density; myTextView.setTextSize (TypedValue.COMPLEX_UNIT_SP, textSize);
P Kuijpers

52
리소스에서 sp 크기를 얻는 경우 다음과 같이 COMPLEX_UNIT_PX를 사용해야합니다. textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));이 방법으로 텍스트 크기를 가져 오면 화면 밀도와 텍스트 배율을 모두 고려하여 SP를 PX로 변환합니다.
Ciske Boekelo

제공된 솔루션이 표시된 것처럼 저에게 효과적이었습니다. 감사!
Martin Erlic

35

속성DisplayMetrics 을 사용하여 객체를 사용하여 픽셀과 크기 조정 된 픽셀 간을 변환 할 수 있습니다 .scaledDensity

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 

1
이것은 화면 밀도 스케일링 계수를 고려하지만 사용자가 설정을 통해 지정한 텍스트 스케일 계수는 아닙니다. @Santosh의 솔루션은이 요소를 고려할 것이지만이 코드는 그렇지 않습니다.
greg7gkb

3
그러나 때로는 캔버스에 페인트를 쓸 때 @Santosh의 방법을 사용할 수 없습니다. 그런 다음이 방법이 편리하고 잘 작동 하므로이 두 가지 답변에 엄지 손가락을 쓰십시오!
byemute

1
@ greg7gkb는 사실이 아니며 문서에 따르면 may be adjusted in smaller increments at runtime based on a user preference for the font size글꼴 크기 고려됩니다.
Luca Vitucci

32

보다 깨끗하고 재사용 가능한 접근 방식은

디렉토리 dimens.xml안의 파일 에서 텍스트 크기를 정의하십시오 res/values/.

</resources>
   <dimen name="text_medium">14sp</dimen>
</resources>

그런 다음에 적용하십시오 TextView.

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));

20

소스 코드를 기반으로 setTextSize:

public void setTextSize(int unit, float size) {
    Context c = getContext();
    Resources r;

    if (c == null)
        r = Resources.getSystem();
    else
        r = c.getResources();

    setRawTextSize(TypedValue.applyDimension(
        unit, size, r.getDisplayMetrics()));
}

픽셀에 대한 디멘션을 계산하기 위해이 기능을 작성합니다.

int getPixels(int unit, float size) {
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    return (int)TypedValue.applyDimension(unit, size, metrics);
}

단위는 다음과 같습니다 TypedValue.COMPLEX_UNIT_SP.


마지막 방법은 생명의 은인입니다.
Ajibola

12

기본적으로 setTextSize, 단위가없는 SP (픽셀 크기 조정)

public void setTextSize (float size) 
Added in API level 1
Set the default text size to the given value, interpreted as "scaled pixel" units. This 
size is adjusted based on the current density and user font size preference.

11

@John Leehey와 @PeterH에게 감사드립니다 :

desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);

dimen.xml에서 R.dimen.desired_sp를 25로 정의하면 문제가 발생합니다.

  1. 비 HD 장치에서 : desiredSp는 여전히 25, 밀도 = 1
  2. HD 기기 (예 : Nexus 7 2 세대) : desiredSp가 50 ish, 밀도 = 2

11

허용 된 답변이 작동하지 않는 경우 (예 : 페인트를 처리 할 때) 다음을 사용할 수 있습니다.

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);

좋아, 그것은 작동한다, 그것이 내가 원하는 것, 그것을 공유해 주셔서 감사합니다!
Park Eun Neul

8
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))

텍스트 크기를 픽셀 값 (COMPLEX_UNIT_PX)으로 설정하는 것이 어떻게 도움이되는지 설명하십시오. OP, "sp 값에 텍스트 크기 할당"
Bö macht Blau

당신이 사용하는 경우 COMPLEX_UNIT_PX밀도를 나누어야합니다.
William Hu

getDimension이 이미 'dp'를 'px'로 변환했기 때문이라고 생각합니다.
Ali Mousavi Kherad

3

PXSP 형식으로 변환하기위한 코드입니다 . 100 % 작품

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

0

모든 솔루션을 시도했지만 허용 가능한 결과를 제공하지 않은 경우 (기본적으로 매우 큰 글꼴이있는 장치에서 작업 중이었기 때문에) 다음이 저에게 효과적이었습니다 (COMPLEX_UNIT_DIP = 장치 독립적 픽셀).

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

0

API 레벨 1에서이 public void setTextSize (float size)방법을 사용할 수 있습니다 .

설명서에서 :

기본 텍스트 크기를 "스케일 된 픽셀"단위로 해석되는 지정된 값으로 설정하십시오. 이 크기는 현재 밀도 및 사용자 글꼴 크기 기본 설정에 따라 조정됩니다.

매개 변수 : size-> float : 크기가 조정 된 픽셀 크기입니다.

그래서 당신은 간단하게 할 수 있습니다 :

textView.setTextSize(12); // your size in sp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.