XRichText
Библиотека для Android с богатым текстовым контентом, которая поддерживает смешанный текст и изображения, редактирование и предварительный просмотр, а также вставку и удаление изображений.
Импортируйте xrichtext как модуль в свой проект.
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"/>
Для получения дополнительной информации обратитесь к демонстрационному приложению.
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
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 см. в демо.
Способ использования см. в демонстрационном коде.
Эта библиотека основана на следующих проектах, спасибо за отличные работы!
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 )