이번에 회사에서 작업을 하는데

이런 뷰를 만들어야 할 일이 생겼다.

이전에는 \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로 제공한다면 알려주시길 바람!

+ Recent posts