Android 글꼴 지식 총화
1.Android 시스템 은 기본적으로 Roboto 라 는 글꼴 을 사용 하 는데 이것 은 Google 이 추천 하 는 글꼴 전송 문 이기 도 합 니 다.그것 은 굵 은 몸,기울 임 꼴 등 다양한 글꼴 형식의 선택 을 제공 했다.
2.Android 에서 저 희 는 보통 TextView 컨트롤 을 통 해 글꼴 의 디 스 플레이 를 직접 또는 간접 적 으로 불 러 옵 니 다.Android 가 제공 하 는 글꼴 디 스 플레이 에 관 한 컨트롤 은 TextView 를 직접 또는 간접 적 으로 계승 하기 때 문 입 니 다.예 를 들 어 EditText,Button 등 은 다음 에 TextView 계승 그림 을 보 여 줍 니 다.
3.TextView 에서 글꼴 의 표 시 를 설정 할 수 있 는 세 가지 속성 이 있 습 니 다.
1)、textStyle
2)、typeface
3)、fontFamily
다음은 이 세 가지 속성 을 중점적으로 소개 하 겠 습 니 다.
2.textStyle
textStyle 은 주로 글꼴 의 스타일 을 설정 하 는 데 사 용 됩 니 다.TextView 의 사용자 정의 속성 중 하 나 를 보 겠 습 니 다.
//TextView textStyle
<attr name="textStyle">
<flag name="normal" value="0" />
<flag name="bold" value="1" />
<flag name="italic" value="2" />
</attr>
위 사용자 정의 속성 에서 알 수 있 습 니 다:1.textStyle 은 주로 세 가지 스타일 이 있 습 니 다.
normal:기본 글꼴굵 은 몸italic:기울 임 꼴
2.textStyle 은 flag 로 불 러 옵 니 다.flag 가 표시 하 는 값 은 하거나 연산 할 수 있 습 니 다.즉,우 리 는 다양한 글꼴 스타일 을 설정 하여 중첩 할 수 있 습 니 다.
다음은 xml 에 설정 합 니 다.다음 그림:
이 를 통 해 알 수 있 듯 이 TextView 의 textStyle 속성 에 굵 은 몸 과 기울 임 꼴 두 가지 스타일 을 중첩 하여 오른쪽 에 미리 보기 효 과 를 볼 수 있 습 니 다.
마찬가지 로 우 리 는 코드 에 설정 할 수 있 지만 코드 에 글꼴 스타일 을 설정 하면 한 가지 만 설정 할 수 있 고 중첩 할 수 없습니다.
mTextView.setTypeface(null, Typeface.BOLD)
3.타이 피 스typeface 는 주로 TextView 의 글꼴 을 설정 하 는 데 사 용 됩 니 다.TextView 의 사용자 정의 속성 중 하 나 를 보 겠 습 니 다.
//TextView typeface
<attr name="typeface">
<enum name="normal" value="0" />
<enum name="sans" value="1" />
<enum name="serif" value="2" />
<enum name="monospace" value="3" />
</attr>
위 사용자 정의 속성 에서 알 수 있 습 니 다:1.typeface 는 4 가지 글꼴 을 제공 합 니 다:
noraml:일반 글꼴,시스템 기본 글꼴산 스:비 안감 글씨체serif:라이닝 글씨체monospace:등 폭 글꼴
2.typeface 는 enum 으로 불 러 옵 니 다.enum 은 매 거 진 유형 을 표시 하고 매번 하나만 선택 할 수 있 습 니 다.따라서 우 리 는 매번 하나의 글꼴 만 설정 할 수 있 고 중첩 할 수 없습니다.
다음은 xml 에 설정 합 니 다.다음 그림:
이 몇 가지 글씨체 의 차 이 를 간단하게 소개 합 니 다.
serif(라이닝 글꼴):글자 의 획 시작 과 끝 에 추가 로 장식 되 어 있 으 며,획 의 굵기 는 직 횡 에 따라 다 를 수 있 습 니 다.
sans(비 안감 글꼴):serif 글꼴 이 없습니다.이 추가 장식 은 noraml 글꼴 과 같 습 니 다.
monospace(등 폭 글꼴):모든 문자 의 폭 을 제한 하여 같은 폭 의 효 과 를 얻 도록 합 니 다.
마찬가지 로 우리 도 코드 에서 설정 할 수 있다.
mTv.setTypeface(Typeface.SERIF)
4.fontFamily font Family 는 강화 판 type:face 에 해당 합 니 다.안 드 로 이 드 시스템 이 지원 하 는 일련의 글꼴 을 표시 합 니 다.모든 글꼴 에 별명 이 있 습 니 다.별명 을 통 해 이 글꼴 을 설정 할 수 있 습 니 다.TextView 의 사용자 정의 속성 중 하 나 를 보 겠 습 니 다.
//TextView fontFamily
<attr name="fontFamily" format="string" />
위 사용자 정의 속성 에서 알 수 있 습 니 다:font Family 는 String 형식의 값 을 받 습 니 다.즉,글꼴 별명 을 통 해 이 글꼴 을 설정 할 수 있 습 니 다.다음 그림:
이 를 통 해 알 수 있 듯 이 모든 계열 의 글꼴 스타일 을 세밀 하 게 구분 하고 xml 에서 설정 합 니 다.
우 리 는 코드 에서 그 에 게 설정 을 하고 있다.
mTv.setTypeface(Typeface.create("sans-serif-medium",Typeface.NORMAL))
값 의 주의:fontFamily 설정 의 일부 글꼴 은 호환성 문제 가 있 습 니 다.예 를 들 어 제 가 위 에 설정 한 sans-serif-medium 글꼴 은 Android 시스템 버 전이 21 이상 이 어야 유효 합 니 다.21 보다 작 으 면 기본 글꼴 을 사용 합 니 다.따라서 fontFamily 속성 을 사용 할 때 이 문 제 를 주의해 야 합 니 다.여기까지,우 리 는 안 드 로 이 드 글꼴 에 영향 을 주 는 세 가지 속성 을 다 말 했 지만,내 마음속 에 의문 이 하나 있다.🤔️ ?이 세 가지 속성 을 동시에 설정 하면 같이 효력 이 발생 합 니까?
이 문 제 를 가지 고 우 리 는 소스 코드 를 탐색 해 보 자.
5.textStyle,typeface,font Family 3 자 관계 분석
TextView 는 우리 가 그것 을 사용 하기 전에 초기 화 를 해 야 합 니 다.마지막 으로 가장 많은 파 라 메 터 를 사용 하 는 구조 방법 을 사용 할 것 입 니 다.
public TextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
// .....
//
readTextAppearance(context, appearance, attributes, false /* styleArray */);
//
applyTextAppearance(attributes);
}
private void applyTextAppearance(TextAppearanceAttributes attributes) {
// .....
setTypefaceFromAttrs(attributes.mFontTypeface, attributes.mFontFamily,
attributes.mTypefaceIndex, attributes.mTextStyle, attributes.mFontWeight);
}
위의 이 호출 체인 은 먼저 TextView 설정 과 관련 된 속성 을 읽 습 니 다.글꼴 과 관련 된 몇 가 지 를 보 겠 습 니 다.
private void readTextAppearance(Context context, TypedArray appearance,
TextAppearanceAttributes attributes, boolean styleArray) {
//...
switch (index) {
case com.android.internal.R.styleable.TextAppearance_typeface:
attributes.mTypefaceIndex = appearance.getInt(attr, attributes.mTypefaceIndex);
if (attributes.mTypefaceIndex != -1 && !attributes.mFontFamilyExplicit) {
attributes.mFontFamily = null;
}
break;
case com.android.internal.R.styleable.TextAppearance_fontFamily:
if (!context.isRestricted() && context.canLoadUnsafeResources()) {
try {
attributes.mFontTypeface = appearance.getFont(attr);
} catch (UnsupportedOperationException | Resources.NotFoundException e) {
// Expected if it is not a font resource.
}
}
if (attributes.mFontTypeface == null) {
attributes.mFontFamily = appearance.getString(attr);
}
attributes.mFontFamilyExplicit = true;
break;
case com.android.internal.R.styleable.TextAppearance_textStyle:
attributes.mTextStyle = appearance.getInt(attr, attributes.mTextStyle);
break;
//...
default:
}
}
상기 코드 에서 우 리 는 볼 수 있다.1.typeface 속성 을 설정 할 때 해당 하 는 속성 값 을 mTypefaceIndex 에 부여 하고 mFontFamily 를 null 로 설정 합 니 다.
2.fontFamily 속성 을 설정 할 때 먼저 appearance.getFont()방법 으로 글꼴 파일 을 가 져 옵 니 다.가 져 올 수 있 으 면 mFontTypeface 에 값 을 부여 하고 가 져 오지 못 하면 appearance.getString()방법 으로 현재 글꼴 별명 을 가 져 오고 mFontFamily 에 값 을 부여 합 니 다.
메모:font Family 에 제3자 글꼴 을 설정 하면 appearance.getFont()방법 으로 글꼴 을 가 져 올 수 없습니다.
3.textStyle 속성 을 설정 하면 가 져 온 속성 값 을 mTextStyle 에 부여 합 니 다.
상기 방법 이 끝나 면 setTypefaceFromAtts()방법 을 조정 합 니 다.이 방법 은 최종 TextView 에서 글꼴 을 설정 하 는 방법 입 니 다.이 방법 을 분석 해 보 겠 습 니 다.
private void setTypefaceFromAttrs(@Nullable Typeface typeface, @Nullable String familyName,
@XMLTypefaceAttr int typefaceIndex, @Typeface.Style int style,
@IntRange(from = -1, to = FontStyle.FONT_WEIGHT_MAX) int weight) {
if (typeface == null && familyName != null) {
// Lookup normal Typeface from system font map.
final Typeface normalTypeface = Typeface.create(familyName, Typeface.NORMAL);
resolveStyleAndSetTypeface(normalTypeface, style, weight);
} else if (typeface != null) {
resolveStyleAndSetTypeface(typeface, style, weight);
} else { // both typeface and familyName is null.
switch (typefaceIndex) {
case SANS:
resolveStyleAndSetTypeface(Typeface.SANS_SERIF, style, weight);
break;
case SERIF:
resolveStyleAndSetTypeface(Typeface.SERIF, style, weight);
break;
case MONOSPACE:
resolveStyleAndSetTypeface(Typeface.MONOSPACE, style, weight);
break;
case DEFAULT_TYPEFACE:
default:
resolveStyleAndSetTypeface(null, style, weight);
break;
}
}
}
상기 코드 단계:1.typeface 가 비어 있 고 family Name 이 비어 있 지 않 을 때 family Name 의 글꼴 을 가 져 옵 니 다.
2.typeface 가 비어 있 지 않 고 family Name 이 비어 있 을 때 typeface 의 글꼴 을 가 져 옵 니 다.
3.typeface 와 family Name 이 비어 있 으 면 typefaceIndex 의 값 에 따라 해당 하 는 글꼴 을 가 져 옵 니 다.
4.typeface,family Name 과 typefaceIndex 는 우리 가 분석 한 readTextAppearance 방법 에 값 을 부여 합 니 다.
5.resolve Style AndSetTypefce 방법 은 글꼴 과 글꼴 스타일 을 설정 합 니 다.
6.style 은 readTextAppearance 방법 에서 값 을 부여 합 니 다.그 는 설정 글꼴 과 충돌 하지 않 습 니 다.
자,이제 코드 분석의 차이 가 많 지 않 습 니 다.위의 그 의문 을 다시 볼 까요?우 리 는 가설 법 을 사용 하여 유도 한다.
Xml 에 typeface,family Name,textStyle 을 설정 했다 고 가정 하면 위 에서 분석 한 바 와 같이:
1、textStyle 은 반드시 유효 합 니 다
2.typeface 속성 을 설정 하면 typefaceIndex 가 할당 되 고 family Name 이 비어 있 습 니 다.
3.familyName 속성 을 설정 하면 상황 에 따라 1.시스템 글꼴 을 설정 하면 type:face 가 할당 되 고 familyName 이 비어 있 습 니 다.2.제3자 글꼴 이 설정 되 어 있 으 면 typeface 가 비어 있 고 family Name 이 할당 되 었 습 니 다.
따라서 이 세 가지 속성 을 설정 하면 type:face 와 family Name 중 하 나 는 비어 있 지 않 기 때문에 세 번 째 조건 체 를 가지 않 습 니 다.그러면 type:face 설정 의 속성 은 유효 하지 않 고 나머지 두 가지 속성 은 모두 유효 합 니 다.
마지막 으로 이 세 가지 속성 에 대해 총 결 을 한다.
1.fontFamily,typeface 속성 은 글꼴 설정 에 사 용 됩 니 다.모두 설정 하면 fontFamily 속성 을 우선 사용 합 니 다.typeface 속성 은 유효 하지 않 습 니 다.
2.textStyle 은 글꼴 스타일 설정 에 사용 되 며 글꼴 설정 과 충돌 하지 않 습 니 다.
위의 이 소스 코드 분석 은 약간 복잡 할 수 있 습 니 다.잘 모 르 는 부분 이 있 으 면 댓 글 에 질문 을 남 겨 주세요.
6.TextView 설정 글꼴 속성 소스 분석
위의 소스 코드 분석 을 통 해 우 리 는 font Family,typeface 와 textStyle 세 사람의 관 계 를 잘 알 게 되 었 다.다음은 우리 가 설정 한 이 속성 들 이 어떻게 이런 효 과 를 실현 하 는 지 연구 해 보 자.또 소스 코드 분석 부분 에 이 르 렀 습 니 다.😂,좀 지루 할 수도 있 지만 잘 보면 많은 것 을 얻 고 끝 낼 것 이다.
위 에서 Xml 또는 코드 로 설정 한 글꼴 속성 은 TextView 의 setTypeface 로 다시 불 러 오 는 방법 입 니 다.
//
public void setTypeface(@Nullable Typeface tf) {
if (mTextPaint.getTypeface() != tf) {
// mTextPaint
mTextPaint.setTypeface(tf);
//
if (mLayout != null) {
nullLayouts();
requestLayout();
invalidate();
}
}
}
//
public void setTypeface(@Nullable Typeface tf, @Typeface.Style int style) {
if (style > 0) {
if (tf == null) {
tf = Typeface.defaultFromStyle(style);
} else {
tf = Typeface.create(tf, style);
}
// ,
setTypeface(tf);
//
int typefaceStyle = tf != null ? tf.getStyle() : 0;
int need = style & ~typefaceStyle;
//
mTextPaint.setFakeBoldText((need & Typeface.BOLD) != 0);
mTextPaint.setTextSkewX((need & Typeface.ITALIC) != 0 ? -0.25f : 0);
} else {
mTextPaint.setFakeBoldText(false);
mTextPaint.setTextSkewX(0);
setTypeface(tf);
}
}
상기 코드 분석:리 셋 방법 1:
TextView 설정 글꼴 은 실제 mTextPaint 를 조작 하 는 것 입 니 다.mTextPaint 는 TextPaint 의 클래스 대상 으로 Paint 즉 화필 을 계승 하기 때문에 저희 가 설정 한 글꼴 은 실제로 화필 을 호출 하 는 방법 으로 그립 니 다.
리 셋 방법 2:
다시 불 러 오 는 방법 1 에 비해 법 2 는 textStyle 인 자 를 전달 하 는데 주로 굵 은 몸 과 기울 임 꼴 을 표시 하 는 데 사 용 됩 니 다.
1)textStyle 을 설정 하면 첫 번 째 조건 체 에 들 어 갑 니 다.상황 에 따라 1.들 어 오 는 tf 가 null 이면 들 어 오 는 style 에 따라 Typeface 글꼴 을 가 져 옵 니 다.2.null 이 아니라면 들 어 오 는 tf 와 style 에 따라 Typeface 글꼴 을 가 져 옵 니 다.글꼴 을 설정 하면 붓 의 굵 은 몸 과 기울 임 꼴 설정 도 열 립 니 다.
2)textStyle 을 설정 하지 않 으 면 글꼴 만 설정 하고 붓 의 굵 은 기울 임 꼴 을 false 와 0 으로 설정 합 니 다.
상기 분석 을 통 해 알 수 있 듯 이 TextView 설정 글꼴 과 글꼴 스타일 은 결국 붓 을 통 해 이 루어 진다.
7.총화
이 글 은 주로 다음 과 같이 말 했다.
1.Android 글꼴 에 대한 소개
2.Android 글꼴 표시 에 영향 을 주 는 세 가지 속성
3.textStyle,typeface,font Family 세 사람의 관계
4.설정 한 이 세 가지 속성 은 어떻게 이런 효 과 를 실현 합 니까?
아마 모두 가 물 어 볼 것 이다.너의 위의 그 요 구 는 아직 말 하지 않 았 는데 왜 곧 끝 날 거 야?내 위의 그 요 구 는 오늘 말 한 지식 으로 는 아직 실현 되 지 않 을 것 이다.조급해 하지 마라.안 드 로 이 드 글씨체 에 대해 나 는 시 리 즈 를 쓰 려 고 한다.왜냐하면 내용 이 너무 많 기 때문이다.이 시 리 즈 는 여러분 을 오래 기다 리 게 하지 않 을 것 입 니 다.왜냐하면 금 을 파 는 6 월 에 더욱 도전 하여 간 을 터 뜨 릴 준 비 를 하고 있 기 때 문 입 니 다.😄
자,이 글 은 여기까지 입 니 다.문제 가 있 으 면 저 에 게 메 시 지 를 남 겨 주세요.우리 댓 글 구역 에서 함께 토론 합 시다.🤝
이상 은 안 드 로 이 드 글씨체 에 관 한 지식 을 정리 한 상세 한 내용 입 니 다.안 드 로 이 드 글씨체 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 해 주 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.