개발/Android
LeadingMarginSpan Customize 하기
레란희
2021. 1. 8. 21:31
이번에 회사에서 작업을 하는데
이런 뷰를 만들어야 할 일이 생겼다.
이전에는 \n과 스페이스(또는 공백문자)로 맞추려고했으나, 안드로이드는 워낙 지원하는 단말기가 많아 각 단말기별/폰트별로 결과물에 차이가 발생하였다.
검색해보니 LeadingMarginSpan이라는 게 있었는데 적용해보니 이런 식으로 되는 것을 확인함.
\n으로 인한 줄바꿈은 무조건 새로운 줄이라고 인식해서 그런 것 같았다.
public abstract class LeadingSubTextSpan implements LeadingMarginSpan {
int leading=10; //얼마만큼 들여쓰기 할 건지
private int margin=0;
public LeadingSubTextSpan(int leading) {
this.leading = leading;
}
public abstract boolean isSubText(String text); //여백 줘야 하는 줄인지 체크하는 메소드
@Override
public int getLeadingMargin(boolean b) {
return margin;
}
@Override
public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, CharSequence text, int start, int end, boolean isFirst, Layout layout) {
int m = 0;
if(start > 0){
String t = text.toString().substring(start-1);
if(t.startsWith("\n") && isSubText(t)) {
m = leading;
}
}
margin = m;
}
}
abstract 클래스이고, isSubText()라는 메소드를 통해 줄바꿈을 할 것인지 판단하도록 하였다. 인자로 넘기는 text는 각 줄의 텍스트..
사용할 때는 아래와 같이 사용한다.
SpannableStringBuilder b = new SpannableStringBuilder(stringBuilder);
int leading = 100;
b.setSpan(new LeadingSubTextSpan(leading) {
@Override
public boolean isSubText(String text) {
return !text.startsWith("\n*");
}
}, 0, b.length(), 0);
textView.setText(b);
leading 부분에 숫자를 넣어도 되지만
textView.getPaint().measureText("가나다");
이런 식으로 하면 해당 textView에서 '가나다'라는 String이 표시될 때의 너비를 가져올 수 있으니
활용해서 사용하는 게 편할 것 같다.
음.. 이런 기능을 지원하지 않았다는 게 좀 신기할 따름인데
알고보니 원래 있었던 기능인데 내가 몰랐을 수도 있겠다는 생각이 드네 ㅜㅜ ..
기존에 API로 제공한다면 알려주시길 바람!