1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/sendtion-XRichText

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

XRichText

Библиотека для Android с богатым текстовым контентом, которая поддерживает смешанный текст и изображения, редактирование и предварительный просмотр, а также вставку и удаление изображений.

Принцип реализации:

  • В качестве внешнего слоя используется ScrollView, который содержит LinearLayout. LinearLayout заполняется элементами TextView и ImageView.
  • При удалении элементы TextView и ImageView удаляются в зависимости от положения курсора, а текст автоматически объединяется.
  • Сгенерированные данные представляют собой список коллекций, которые можно настроить для обработки данных.

Замечания:

  • Версия V1.4 открыла интерфейс событий щелчка по изображению и удаления изображения. Конкретный способ использования можно найти в документации или в демоверсии.
  • Версия V1.6 обновила RxJava до версии 2.2.3, а RxAndroid — до версии 2.1.0. При установке размера шрифта необходимо указывать единицы измерения, например app:rt_editor_text_size="16sp".
  • Начиная с версии V1.9.3 в библиотеке Xrichtext удалена зависимость от Glide, и открыт интерфейс для настройки загрузчика изображений. Конкретный способ использования можно найти в документации или в демонстрационной версии.
  • В демонстрационном приложении в качестве средства выбора изображений используется библиотека Matisse с открытым исходным кодом от Zhihu. Для получения пути к изображению на устройствах Android 7.0 используется FileProvider.
  • Среда разработки обновлена до AS 3.4.2 + Gradle 4.4 + compileSDK 28 + support library 28.0.0. Если при импорте проекта появляется сообщение об ошибке версии, рекомендуется вручную изменить её на свою версию.
  • Рекомендуется ознакомиться с демонстрационным приложением для понимания библиотеки. Её можно импортировать с помощью Gradle или загрузить исходный код для модификации.
  • Если у вас есть вопросы, не стесняйтесь задавать их. Приглашаем вас присоединиться к группе QQ для обсуждения: 745215148.

Скриншот предварительного просмотра

Список заметок Детали текстовой заметки Редактирование заметок Подробности заметки с изображением

Способ использования

1. Импорт в виде модуля

Импортируйте xrichtext как модуль в свой проект.

2. Зависимости Gradle

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

dependencies {
    implementation 'com.github.sendtion:XRichText:1.9.4'
}

Если возникает проблема с несоответствием версий поддержки, исключите библиотеку поддержки в XRichText или обновите свою библиотеку поддержки до версии 28.0.0. Способ использования:

implementation ('com.github.sendtion:XRichText:1.9.4') {
    exclude group: 'com.android.support'
}

Конкретное использование

Добавьте основанный на EditText редактор (редактируемый) в XML-макет.

<com.sendtion.xrichtext.RichTextEditor
    android:id="@+id/et_new_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:rt_editor_text_line_space="6dp"
    app:rt_editor_image_height="500"
    app:rt_editor_image_bottom="10"
    app:rt_editor_text_init_hint="Введите здесь содержимое"
    app:rt_editor_text_size="16sp"
    app:rt_editor_text_color="@color/grey_900"/>

Добавьте основанный на TextView редактор (не редактируемый) в XML-макете.

<com.sendtion.xrichtext.RichTextView
    android:id="@+id/tv_note_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:rt_view_text_line_space="6dp"
    app:rt_view_image_height="0"
    app:rt_view_image_bottom="10"
    app:rt_view_text_size="16sp"
    app:rt_view_text_color="@color/grey_900"/>

Пользовательские атрибуты

Для получения дополнительной информации обратитесь к демонстрационному приложению.

  • RichTextView
rt_view_image_height        Высота изображения, по умолчанию 0 для адаптации, можно установить фиксированное значение, например 500, 800 и т. д.
rt_view_image_bottom        Интервал между двумя изображениями сверху и снизу, по умолчанию 10
rt_view_text_size           Размер текста, используйте sp в качестве единицы измерения, например, 16sp
rt_view_text_color          Цвет текста, используйте color для ресурсов
rt_view_text_line_space      Межстрочный интервал, такой же, как у TextView, например, 6dp
  • RichTextEditor
rt_editor_image_height      Высота изображения, по умолчанию 500, можно установить фиксированное значение, например 500, 800 и т. д., 0 означает адаптивную высоту
rt_editor_image_bottom      Интервал между двумя изображениями сверху и снизу, по умолчанию 10
rt_editor_text_init_hint    Подсказка по умолчанию, по умолчанию «Пожалуйста, введите контент»
rt_editor_text_size         Размер текста, используйте sp в качестве единицы измерения, например 16sp
rt_editor_text_color        Цвет текста, используйте цвет для ресурсов
rt_editor_text_line_space   Межстрочный интервал, такой же, как у TextView, например, 6dp

Генерация данных

Я сохранил данные в формате HTML и сохранил строку в базе данных.

String noteContent = getEditData();

private String getEditData() {
    List<RichTextEditor.EditData> editList = et_new_content.buildEditData();
    StringBuffer content = new StringBuffer();
    for (RichTextEditor.EditData itemData : editList) {
        if (itemData.inputStr != null) {
            content.append(itemData.inputStr);
        } else if (itemData.imagePath != null) {
            content.append("<img src=\"").append(itemData.imagePath).append("\"/>");
        }
    }
    return content.toString();
}

Отображение данных

et_new_content.post(new Runnable() {
     @Override
     public void run() {
         showEditData(content);
     }
 });

protected void showEditData(String content) {
    et_new_content.clearAllLayout();
    List<String> textList = StringUtils.cutStringByImgTag(content);
    for (int i = 0; i < textList.size(); i++) {
        String text = textList.get(i);
        if (text.contains("<img")) {
            String imagePath = StringUtils.getImgSrc(text);
            int width = ScreenUtils.getScreenWidth(this);
``` ```
int height = ScreenUtils.getScreenHeight(this);
et_new_content.measure(0, 0);
Bitmap bitmap = ImageUtils.getSmallBitmap(imagePath, width, height);
if (bitmap != null) {
    et_new_content.addImageViewAtIndex(et_new_content.getLastIndex(), bitmap, imagePath);
} else {
    et_new_content.addEditTextAtIndex(et_new_content.getLastIndex(), text);
    et_new_content.addEditTextAtIndex(et_new_content_getLastIndex(), text);
}

Событие клика по изображению

tv_note_content.setOnRtImageClickListener(new RichTextView.OnRtImageClickListener() {
@Override
public void onRtImageClick(String imagePath) {
ArrayList<String> imageList = StringUtils.getTextFromHtml(myContent, true);
int currentPosition = imageList.indexOf(imagePath);
showToast("点击图片:" + currentPosition + ":" + imagePath);
// TODO 点击图片预览
}
});

Использование загрузчика изображений

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

XRichText.getInstance().setImageLoader(new IImageLoader() {
@Override
public void loadImage(String imagePath, ImageView imageView, int imageHeight) {
// Если это сетевая картинка
if (imagePath.startsWith("http://") || imagePath.startsWith("https://")) {
Glide.with(getApplicationContext()).asBitmap().load(imagePath).dontAnimate()
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
if (imageHeight > 0) { // Фиксированная высота
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT, imageHeight); // Фиксируем высоту изображения, не забудьте установить обрезку
lp.bottomMargin = 10; // Отступ снизу изображения
imageView.setLayoutParams(lp);
Glide.with(getApplicationContext()).asBitmap().load(imagePath).centerCrop()
.placeholder(R.mipmap.img_load_fail).error(R.mipmap.img_load_fail).into(imageView);
} else { // Адаптивная высота
Glide.with(getApplicationContext()).asBitmap().load(imagePath)
.placeholder(R.mipmap.img_load_fail).error(R.mipmap.img_load_fail).into(new TransformationScale(imageView));
}
}
});
} else { // Если это локальная картинка
if (imageHeight > 0) { // Фиксированная высота
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT, imageHeight);// Фиксируем высоту изображения, не забудьте установить обрезку
lp.bottomMargin = 10;// Отступ снизу изображения
imageView.setLayoutParams(lp);

Glide.with(getApplicationContext()).asBitmap().load(imagePath).centerCrop()
.placeholder(R.mipmap.img_load_fail).error(R.mipmap.img_load_fail).into(imageView);
} else {// Адаптивная высота
Glide.with(getApplicationContext()).asBitmap().load(imagePath)
.placeholder(R.mipmap.img_load_fail).error(R.mipmap.img_load_fail).into(new TransformationScale(imageView));
}
}
}
});

Класс TransformationScale см. в демо.

Способ использования см. в демонстрационном коде.

История обновлений

v1.9.4 2019.11.05

  • lib, решена проблема с тем, что сетевые изображения не могут адаптироваться к высоте;
  • demo, предоставлена реализация загрузки изображений через https;
  • demo, XRichText устанавливает загрузчик изображений в Application.

v1.9.3 2019.10.19

  • Убрана зависимость от Glide, заменена на интерфейс обратного вызова, можно использовать пользовательский загрузчик изображений;
  • Оптимизирована структура кода, повышена стабильность.

v1.9.1 2019.04.30

  • Событие щелчка по изображению возвращает нажатое представление;
  • Исправлена проблема искажения изображения при отображении;
  • В демо реализована функция увеличения и просмотра изображения при нажатии;
  • Поддержка библиотеки обновлена до версии 28.0.0.

v1.9.0 2019.04.10

  • Редактирование поддерживает выделение ключевых слов;
  • Исправлено исключение нулевого указателя при вставке изображения;
  • Обработка исключений в коде.

v1.8 2018.12.02

  • Исправлена проблема, когда настройка цвета текста при редактировании была неэффективной;
  • Добавлены анимация и удаление при редактировании изображений. #### v1.5 2018.07.10
  • Исправлена проблема, когда при загрузке нескольких изображений подряд на странице с деталями все изображения имели одинаковую высоту с первым изображением.
  • Исправлена ошибка, из-за которой при клике на изображение в демо возникал пустой указатель.
  • Удалён тестовый код, который добавлял сетевое изображение после добавления изображения в демо.

v1.4 2018.06.22

  • Добавлены настраиваемые атрибуты для установки высоты изображения, интервала между соседними изображениями, размера и цвета текста.
  • Решена проблема с крахом приложения из-за отсутствия реализации интерфейса удаления изображения, открыт интерфейс удаления изображения.
  • Реализована функция просмотра увеличенного изображения при клике, открыт интерфейс клика по изображению.
  • Введено отображение информации о крахе, информация о крахе отправляется по электронной почте.
  • Оптимизирован код вставки изображения, удалены лишние неиспользуемые строки кода.

v1.3 2018.05.05

  • Обновлена зависимость Glide до версии 4.7.1, использование Glide4: http://bumptech.github.io/glide/doc/getting-started.html.
  • Среда разработки обновлена до AS 3.1.2 + Gradle 4.4.
  • Улучшена логика вставки изображений.
  • Добавлен пример кода вставки сетевого изображения в демо.
  • Заменён селектор изображений в демо на matisse от Zhihu.

v1.2 2018.04.05

  • При редактировании заметок используется обратный вызов интерфейса для обработки операции удаления изображения извне, можно реализовать удаление локального или сетевого изображения самостоятельно.
  • Реализовано загрузка сетевых изображений, при вставке изображения можно передать путь к локальному изображению на SD-карте или адрес сетевого изображения.
  • Во время создания или редактирования заметок между несколькими последовательными изображениями добавляется поле ввода, что упрощает ввод текста между изображениями.
  • Исправлено исчезновение текста после вставки изображения в файл.
  • Исправлено появление проблемы с обратным порядком вставки изображений при последовательной вставке нескольких изображений.

v1.1 2017.03.27

  • Оптимизация использования памяти, решение проблемы переполнения памяти.
  • Интеграция с RxJava (см. демо).
  • Поддержка непрерывной вставки нескольких изображений без зависания (см. демо).
  • Решение проблем с зависанием и крахом при вставке изображений.

v1.0 2016.10.26

  • Первая версия.
  • Реализация вставки изображений.
  • Реализация смешанного отображения текста и изображений.
  • Реализация редактирования и сохранения.

Благодарности

Эта библиотека основана на следующих проектах, спасибо за отличные работы!

Прочее

Лицензия

Copyright 2019 sendtion

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Одна библиотека для работы с форматированным текстом на Android, поддерживает смешанный текст и изображения, поддерживает редактирование и предварительный просмотр, а также вставку и удаление изображений. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/sendtion-XRichText.git
git@api.gitlife.ru:oschina-mirror/sendtion-XRichText.git
oschina-mirror
sendtion-XRichText
sendtion-XRichText
master