Как разместить длинный текст? - PullRequest
5 голосов
/ 03 декабря 2011

У меня длинный текст и фиксированный размер textView. Как можно показать текст постранично? Пользователи будут взаимодействовать с программой следующим образом: Он проведет пальцем влево или вправо, чтобы перейти к следующей или предыдущей странице.

В настоящее время я создаю PageManager для этой работы. Но это очень ограничено. Основной код для обработки текста:

while (true) {
        newLineIndex = TextUtils.indexOf(content, '\n', processIndex);
        if (newLineIndex == -1) {// till the end of content
            charCount = paint.breakText(content, processIndex, content.length(), false, leftLines * lineWidth, width);
        } else {
            charCount = paint.breakText(content, processIndex, ++newLineIndex, false, leftLines * lineWidth, width);
        }

        leftLines = (int) ((leftLines * lineWidth - width[0]) / lineWidth);
        processIndex += charCount;

        if (leftLines < 1 || processIndex >= content.length()) {
            page = new Page();
            page.endIndex = processIndex;
            page.startIndex = pageBaseLine;
            page.content = content.subSequence(page.startIndex, page.endIndex);
            result.add(page);
            pageBaseLine = processIndex;

            leftLines = lineNumber;
        }

        if (processIndex >= content.length()) {
            break;
        }
    }

Ограничением является то, что страница может обрезать текст как

|A lon|
|g wor|
|d man|

// длинное слово man

или неправильные строки из-за переноса слов:

// Менеджер страниц вычисляет это (2 строки):

|a sentence with loooooooo|

|ooong word abcdefghijklmn|

// Но на самом деле в текстовом представлении (3 строки):

|a sentence with           |

|looooooooooong word      |

|abcdefghijklmn           |

Таким образом, окончательное количество строк больше, чем вычисление. Так что мой менеджер страниц глупый. Кто-нибудь мне поможет? спасибо!

1 Ответ

5 голосов
/ 10 декабря 2011

Возможно, будет слишком поздно для ответа, но я опубликую, как я решил проблему следующим образом.

Я сделал аналогичный проект, но для андроид планшета. В моем приложении есть системная нижняя панель, панель навигации и заголовок. Эти части Activity не участвуют в предварительном просмотре текста, поэтому я хочу исключить их из расчетов. Для экрана 750px эти части занимают 24% экрана, это около 180px. Поэтому я использую следующий алгоритм для просмотра текста в текстовом представлении:

  1. Рассчитать Фактическая высота для просмотра текста, это высота моего текстового обзора: ScreenHeight - ScreenHeight * 0,24
  2. Установить размер текста, например 14,0
  3. Рассчитать количество строк в текстовом файле
  4. Рассчитать количество строк на странице: фактическая высота / размер текста
  5. Рассчитать количество страниц и загрузить их в HashMap

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight() — 0.24*display.getHeight();
mLinesInPage = (int) (Math.floor(height / mTextSize));
mPages = (int) (Math.ceil(mLinesInText / mLinesInPage));

Форматирование и другие преобразования выполняются «на лету». Ничего сложного, но у меня работает. Есть примеры

Перед использованием алгоритма:

enter image description here

После использования алгоритма:

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...