Java 코드를 사용하여 sp 값으로 텍스트 크기를 지정하는 방법 위해 정수 값을 할당하면

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

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



답변


답변

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

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

답변

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

디렉토리 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));

답변

소스 코드를 기반으로 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.


답변

기본적으로 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.

답변

@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

답변

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

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