Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
100 / 79 / 9
Регистрация: 03.08.2014
Сообщений: 447

Постраничный вывод текста в TextView

02.02.2018, 21:45. Показов 1208. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникла задача вывода на экран смартфона текста, порезанного на страницы. Что-то вроде книги. В первом приближении задача решена, но не устраивает ряд мелких нюансов.
Чтобы понять возникшие проблемы кратко опишу алгоритм решения.

Вывод текста на экран идет в TextView в котором отключен скроллинг. Чтобы текст не убегал за нижнюю границу TextView предварительно идет подсчет максимального числа слов, которые могут поместиться на одном экране с учетом размера шрифта, разрешающей способности экрана, плотности и размеров самого экрана.

Как это происходит.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        // получаем метрику дисплея
        DisplayMetrics metrics = getApplicationContext().getResources().getDisplayMetrics();
        // узнаем текущую densityDpi of the display
        float currentDpi = metrics.densityDpi;
        // узнаем The logical density of the display
        float scale = metrics.density;
 
        // высчитываем отступы для рабочей площади экрана ydpi - число пискселей на дюйм экрана по У, xdpi - число пикселей по X
        float pxy = (float) Math.floor((52 * metrics.ydpi)/currentDpi*scale); // 52 высота служебного поля на экране в dp
        float pxx = (float) Math.floor((6 * metrics.xdpi)/currentDpi*scale); // 6 учет padding в TextView
 
        float totalWidth = metrics.widthPixels; // абсолютная ширина экрана в пикселях
        float totalHeight = metrics.heightPixels; // абсолютная высота экрана в пикселях
 
        float screenWidth = totalWidth - pxx; // наша рабочая ширина экрана в пикселях
        float screenHeight = totalHeight - pxy; // наша рабочая высота экрана в пикселях
Далее высчитываем число возможных строк в области отображения

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        // задаем размеры в пикселях для области вывода текста
        TextView myTextView = findViewById(R.id.TextView1);
        myTextView.setMaxHeight((int)screenHeight);
        myTextView.setMaxWidth((int)screenWidth);
 
        // задаем размер текста тип COMPLEX_UNIT_DIP означает указание размера в dp
        myTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); // здесь 18 размер шрифта
 
        // устанавливаем интервал между строк
        myTextView.setLineSpacing(2, 1);
 
        // высота строки в пикселях
        int lineHeight = myTextView.getLineHeight();
 
        // максимальное число строк на экране
        int maxLineCount = (int) Math.floor(screenHeight/lineHeight);
 
        // определяем размер шрифта в пикселях
        int pixelSizeFont = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 18, getResources().getDisplayMetrics());
Далее идет процесс подсчета максимального числа слов для вывода. Из txt-файла считывается текст, который анализируется по-словно. Не буду приводить весь код, в упрощенном варианте это так:

Java
1
2
3
4
5
6
7
8
    // устанавливаем размер шрифта
        Paint paint = new Paint();
        paint.setTextSize(pixelSizeFont);
 
    // выделяем первое текущее слово до первого пробела
    String wordString = new String(paragrafString.substring(0, indexFirstWord)); // indexFirstWord это номер символа первого пробела в строке
    int wordLen = wordString.length(); // число символов в текущем слове
    float wordWidth = (float)Math.floor(paint.measureText(wordString)); // определяем ширину текущего слова в пикселях
Затем ширина текущего слова добавляется к нарастающей сумме ширины текущей строки и сравнивается с screenWidth, рабочей шириной экрана. Если нарастающая сумма строки больше рабочей ширины экрана, то слово переносится на следующую строку. И так далее, до тех пор, пока не будет исчерпано число строк maxLineCount. После этого идет формирование блока текста для следующей страницы.

Все работает нормально, но иногда при выводе вместо, например, 20 строк появляется 21 строка. В эту добавочную строку попадает одно-два слова. Впечатление, что при подсчете используемая ширина, получаемая paint.measureText, немного меньше реально, поэтому строки "уплотнены", а при выводе в TextView этого "уплотнения" нет. Такой эффект есть не всегда, многие страницы отображаются правильно. Поэтому возникла мысль, что лишняя строка появляется в зависимости от текста, много там слов или нет, какая длина слов, много ли пробелов и т.п. Эффект сохраняется как при использовании русского так и английского текста. Текст в кодировке utf-8.
Реже встречаются случаи, когда вывод "короче" расчетного значения.

Никак не могу понять в чем причина. Может быть несовпадение paint и TextView? А может быть я ошибаюсь где-то на этапе определения метрик?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.02.2018, 21:45
Ответы с готовыми решениями:

Вывод 2 ресурсных текста в TextView с использованием java кода
Хочу произвести простое действие, поменять текст, взять его из ресурсов R.string, но при этом использовать сразу 2 ресурса: ...

Постраничный вывод текста
У меня есть функция вывода содержимого файла на экран. И задаётся максимальное количество строк на одну страницу 21. И если у меня на...

Постраничный вывод текста с нумерацией из файла
Здравствуйте. Помогите пожалуйста с написанием скрипта. Он должен выводить текст на экран постранично по 1500 символов с ссылками...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.02.2018, 21:45
Помогаю со студенческими работами здесь

Вывод текста в textview
Помогите разобраться с textview вот код, по замыслу при нажатии кнопки Hello должен выйти текст в textview но функция не работает ...

Постраничный вывод......
Ребят, ни как не получается с постраничным выводом, то-есть он работает, но на страницу выводятся, все номера страниц какие есть. А как...

Постраничный вывод
Всем добрый день! Есть код постраничного вывода из БД, все работает, но при нажатии на следующую страницу, не показывает следующие 10...

Постраничный вывод из бд
Всем доброго времени суток очередной раз нкждаюсь в вашей помощи есть скрипт вывода данных из бд как организовать постраничный вывод по...

Постраничный вывод
Как сделать постраничный вывод этому скрипту <?php $ret = $_SESSION; include('conf.php'); $quer =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru