Богатый текстовый редактор
Учитывая, что насыщенное редактирование текста необходимо для поддержания длинных типов текста, большинство богатых текстов не могут повторно использовать представления, используя пользовательский один редакт. Таким образом, богатый текстовый редактор, реализованный на основе Recycleview, в настоящее время находится в процессе разработки.
Для реализации богатых текстовых редакторов мы обязательно подумаем о нескольких необходимых функциях, которые реализованный редактор должен поддержать:
1. Это включает отображение и редактирование большого количества текста, изображений и стилей текста.
2. включает в себя чрезвычайно сложные взаимодействия с пользователем.
Богатый текстовый редактор, который я знаю на GitHub, в основном реализован на основе двух типов:
Вот несколько личных мнений об этих двух решениях.
Прежде всего, один недостаток производительности рендеринга WebView. Во-вторых, когда он включает в себя чрезвычайно сложные взаимодействия человека с компьютером, будет сложнее реализовать WebView. Другой момент заключается в том, что совместимость WebView также является точкой, которую необходимо учитывать.
Для переписывания одного EditText он действительно очень масштабируется для взаимодействия, текстового рендеринга и поддержки стиля. Однако, учитывая, что здесь будет большое количество изображений, здесь необходимо учитывать ситуацию с памятью. Для EditText определенно нет повторного использования представления. По сути, столько памяти, сколько и картин, требуется. С другой стороны, Native TextView всегда подвергался критике за то, что он отдал большой объем текста, и существует множество решений для оптимизации производительности TextView.
Поэтому я в итоге решил использовать Recyclerview в качестве решения для реализации для реализации богатого текстового редактора. Хотя есть подводные камни, это также возможное решение. (Редактор Douban реализуется с использованием Recyclerview)
Преимущества : во -первых, Recyclervie, как нативный компонент, обладает очень хорошей производительностью для отображения большого количества компонентов пользовательского интерфейса. Во -вторых, механизм мультиплексирования Recyclerview обеспечивает хорошую поддержку управления потреблением памяти.
Недостатки :: Конечно, это не первый выбор для реализации богатых текстовых редакторов. Я столкнулся с множеством больших ловушек в процессе реализации. Вот несколько:
1. Контроль фокуса
2. Сплайсинг данных
3. Style Storage
4. Положение курсора
И гораздо больше ...
К счастью, решение было обнаружено в конце, поэтому я поделюсь этим решением для реализации и предоставлю решение для реализации нуждающихся.
1. Смелый, курсив, подчеркивается, средний, удар, гиперссылка, стиль эталона, H1, H2, H3, H4 текста.
2. Вставьте и удаляйте картинки
3. Выберите текст, чтобы изменить стиль в режиме реального времени
4. Держите стиль в очереди в любом месте.
5. Удалить две линии в одну линию, чтобы поддерживать стиль.
6. Отображайте стили текста в режиме реального времени с курсором на панели управления.
7. Вставьте стили в любой позиции
8. Окончательный текст редактирования передается на Markdown (есть ошибки ~ ...)
ждать. Анкет Анкет
Для реализации Recyclerview соответствующая операция возврата перевозки заключается в добавлении модели, поэтому обертка и удаление возврата каретки требуют большой логической обработки, а также включает в себя сплайсинг и сегментацию индексов стиля. Короче говоря, это большая яма.
После выбора вам необходимо индексировать курсор, стиль, очистить и разделить стиль, воссоздать и назначить стиль. Большая яма, большая яма.
Когда курсор соответствует строке соответствующего стиля, панель ниже меняет текущий стиль в режиме реального времени. Необходимо использовать логическое суждение о интервале, чтобы сделать логические суждения о курсоре и интервалах стиля, и есть все больше и больше ловушек. Анкет Анкет
Есть также много сложной интерактивной обработки, которая здесь не отображается. Вы можете проверить исходный код для деталей.
Ричедатор
Проект не опубликован здесь Jitpack, потому что, как богатый редактор текста, у каждого свои уникальные потребности и методы взаимодействия, и нет никакого способа достичь богатого текста, который может удовлетворить все потребности. А поскольку логика взаимодействия богатых текстовых редакторов действительно сложна, невозможно обеспечить совместимость со всеми взаимодействиями и ситуациями, поэтому мы просто делаем все возможное, чтобы реализовать ситуацию взаимодействия.
1. Представьте Editor Lib в Project 2.xml, чтобы добавить редактор
<com.study.xuan.editor.widget.Editor
android:id="@+id/editor"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Он будет использоваться нормально.
Это настолько просто, что он инкапсулируется и используется для использования Richhelper
//绑定xml中的Editor
public void attach(Editor editor);
//new 一个Editor
public Editor buildEditor(Context context)
//部分事件回调
public void setCallBack(onEditorEventListener callBack)
//操作面板右侧空白增加自定义布局
public void setMoreOperateLayout(View view)
//异步转义MarkDown
public void toMarkDown()
public interface onEditorCallback {
//行数量变化时
void onLineNumChange(List<RichModel> data);
//点击操作面板的图片添加图片,可以使用自己项目中的图片框架,选中后对应调用editor.addPhoto(List<String> data);方法即可
void onPhotoEvent();
//转义MarkDown的进度回调
void onMarkDownTaskDoing(int progress, int max);
//转义MarkDown成功
void onMarkDownTaskFinished(String markdown);
}
Global Singleton, базовая архитектура, помогает реализовать общие функции Richeditor.
Реализационный класс PanelBuilder содержит два класса реализации. FontParambuilder представляет стиль типа символа, а абзацкомвел, представляет стиль типа абзаца. Метод связи между Panle и редактором проходит через Ipanel в базовом Richbuilder Singleton.
Абстрактный инженерный класс, используемый для создания типов SPAN в внешнем уровне. Среди них абстрактные фабрики разделены на три фабрики: iCharacterStyleFactory, iParagraphFactory и iupDateAppearanceFactory, которые соответствуют характеристике (фабрика SPAN в стиле символов), параграфафакторию (фабрика в стиле абзафа) и (пользовательская фабрика не реализована).
Стратегия поиска используется для прохождения и обработки стилей охвата в определенном абзаце. Normalsearch реализует isearchstrategy и использует регулярную обработку обхода (может настроить быструю сортировку или другие эффективные методы сортировки для обработки)
Интерфейс управления параметрами, реализует Parammanager, соответствующий классу, который используется для сравнения и обработки текущего стиля и стиля предварительного входа.
Класс реализации редактора, унаследованный от Recyclerview, Adapter соответствует Richadapter, а модель соответствует Richmodel.
Входной фильтр для обработки стиля при вводе и удалении.
Spanstep1filter
Фильтр первого уровня используется для обработки обработки SPAN_EXCLUSIVE_INCLUSIVE и SPAN_EXCLUSIVE_EXCLUSIVE , когда Стиль обработки добавляет и запутает.
Spanstep2filter
Фильтр второго уровня используется для обработки создания и обслуживания стилей, для получения всех наборов стилей текущего текста, а также для записи соответствующего индекса стиля и для поддержания его в соответствующей Richmodel.
Асинхронная обработка, используемая для обработки преобразования данных в соответствующий тип преобразования.
Разбор
Преобразование интерфейса
MarkdownParse
Логическая обработка преобразована в синтаксис Markdown с использованием регулярных выражений.
Класс обработки данных, используя обработку данных, связанную со стилями слияния, стилями обработки и т. Д.
Панель представляет панель операции, а панель по умолчанию использует Editorpanellpha. Панель реализована через Ipanel в Richbuilder, чтобы связать редактор.
[2018.3.17]: Редактирование богатого текста в пределах текста.
[2018.3.19]: Заполните удаление нескольких строк текста, добавьте одну строку и удалите следующую строку в предыдущую строку. И сохранить стиль.
[2018.3.20]: Заполните удаление и добавление нескольких строк текста, включая первую строку удаления и ввод, сохраняя богатый стиль текста с параграфом.
[2018.3.24]: Полная синхронизация операционной панели после щелчка, сохраняя текущий стиль текста и стиль операции.
[2018.3.29]: завершите функцию вставки новых стилей и первоначально выполните основные функции редактирования.
[2018.4.09]: Полная функция стиля абзаца.
[2018.4.11]: предварительное завершение экрана синтаксиса Markdown.
Copyright 2017 [DrownCoder]
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.