2017년 1월 22일 일요일

Tip - 스트링 나누기

다음과 같은 긴 스트링이 있습니다. 여기서는 임시로 소스에 박아넣었지만, 원래는 Project A - Hello, Xamarin에 썻던 것처럼 리소스에 넣어야 합니다.

        private string longStr = "Xamarin 이란 C# 으로 구현된 소스를 이용하여 " +
                                 "Android/iOS/Windows 앱을 만들수 있도록 해주는 " +
                                 "Cross Platform 이다. 즉, C# 을 이용하여 하나의 " +
                                 "앱을 구현하고, 이를 Xamarin 을 이용하여 각 플랫폼에 " +
                                 "맞는 앱을 만들어내는것이다.";


이 글을 화면에 출력해 보려 합니다.

            Paint pen = new Paint();
            pen.Color = Color.Yellow;
            pen.TextSize = 25;
            canvas.DrawText(longStr, 50, 100, pen);


이와 같이 단순하게 출력해 보면 다음과 같이 나옵니다.



이 문장을 여러 줄에 걸쳐 출력하려면 어떻게 될까요?
시스템적으로 지원하지는 않는 것 같고, 일정 넓이로 잘라주는 코드를 만들어야 합니다.

이 일을 할 수 있는 것이 Android.Graphics.Paint의 메소드 BreakText()입니다.
BreakText()는 다음과 같은 형식을 가지고 있습니다.

        public virtual int BreakText(string text, bool measureForwards,
                                     float maxWidth, float[] measuredWidth);

        text : 잘라야 할 긴 문자열
        measureForwards : true면 앞에서 뒤로, false면 뒤에서 앞으로
        maxWidth : 잘라야 할 넓이
        measureWidth : null이 아닐 경우 실제 넓이 리턴(?)

        return value : 잘리는 위치

즉, 이 함수는 실제로 문자열을 자르는 것이 아니라 잘릴 위치를 찾아주는 함수입니다. 이 함수를 통해 실제로 문자열을 자르는 함수를 만들어야 하죠.

        private List StringDivide(Paint pen, string str, float width)
        {
            var rtn = new List();
            int endValue = 0;
            do
            {
                endValue = pen.BreakText(str, true, 200, null); // 자를 위치를 찾아
                endValue = Math.Min(endValue, str.Length);
                if (endValue > 0)
                {
                    rtn.Add(str.Substring(0, endValue));   // 잘라내서 리스트에 추가
                    str = str.Substring(endValue);         // 리스트에 추가된 부분을 잘라냄
                }
            } while (endValue > 0);
            return rtn;
        }


이것으로 다음과 같이 출력루틴을 바꾸면

            Paint pen = new Paint();
            pen.Color = Color.Yellow;
            pen.TextSize = 25;
            var strList = StringDivide(pen, longStr, 300);
            int y = 100;
            foreach (var str in strList)
            {
                canvas.DrawText(str, 50, y, pen);
                y += 30;
            }




저는 확장뷰를 사용하기에 나눠서 리스트로 만들었지만, Xamarin form을 사용할 때는 중간에 \n을 삽입하는 방식으로 해야 되겠죠.

댓글 없음:

댓글 쓰기