Reicher Texteditor
In Anbetracht der Tatsache, dass eine reiche Textbearbeitung lange Texttypen unterstützen muss, können die meisten reichhaltigen Texte Ansichten nicht mit benutzerdefinierten Einzelbearbeitungen wiederverwenden. Daher ist der auf Recycleview implementierte Rich -Texteditor derzeit im Entwicklungsprozess.
Für die Implementierung reicher Texteditoren werden wir uns auf jeden Fall mehrere notwendige Funktionen vorstellen, die der implementierte Editor unterstützen muss:
1. Es beinhaltet die Anzeige und Bearbeitung einer großen Anzahl von Text, Bildern und Textstilen.
2. beinhaltet äußerst komplexe Benutzerinteraktionen.
Der reiche Texteditor, den ich auf GitHub kenne, wird im Grunde auf zwei Typen implementiert:
Hier sind einige persönliche Meinungen zu diesen beiden Lösungen.
Erstens ist ein Nachteil der Rendering -Leistung von WebView. Zweitens wird es schwieriger, WebView zu implementieren, wenn es extrem komplexe Interaktionen zwischen menschlichen Komputer beinhaltet. Ein weiterer Punkt ist, dass die Kompatibilität von WebView ebenfalls ein Punkt ist, der berücksichtigt werden muss.
Für die Umschreiben eines einzelnen EditText ist es in der Tat sehr skalierbar für Interaktion, Textrendern und Stilunterstützung. In Anbetracht der Tatsache, dass es eine große Anzahl von Bildern geben wird, muss die Speichersituation hier berücksichtigt werden. Für EditText gibt es definitiv keine Wiederverwendung. Grundsätzlich benötigt es so viel Gedächtnis wie es Bilder gibt. Andererseits wurde native Textview immer dafür kritisiert, dass sie eine große Menge Text erzielt, und es gibt viele Lösungen für die Optimierung der Leistung von TextView.
Daher habe ich mich dafür entschieden, Recyclerview als Implementierungslösung für die Implementierung eines reichen Texteditors zu verwenden. Obwohl es Fallstricke gibt, ist es auch eine praktikable Lösung. (Der Editor von DoUban wird mit Recyclerview implementiert)
Vorteile : Erstens hat Recyclervie als native Komponente eine sehr gute Leistung für die Anzeige einer großen Anzahl von UI -Komponenten. Zweitens bietet der Multiplexing -Mechanismus des Recyclerview eine gute Unterstützung für die Kontrolle des Speicherverbrauchs.
Nachteile :: Natürlich ist dies nicht die erste Wahl für die Implementierung reicher Texteditoren. Ich habe im Implementierungsprozess viele große Fallstricke gestoßen. Hier sind einige:
1. Fokuskontrolle
2. Datenspleißen
3. Style Storage
4. Die Position des Cursors
und viel mehr ...
Glücklicherweise wurde die Lösung am Ende gefunden, daher werde ich diese Implementierungslösung hier weitergeben und eine Implementierungslösung für Bedürfnisse von Menschen bereitstellen.
1. BOLD, ITALIC, UNTERLING, MIDSCORE, STRIKETHROUGH, Hyperlink, Referenzstil, H1, H2, H3, H4 des Textes.
2. Einfügen und löschen Sie Bilder
3. Wählen Sie Text aus, um den Stil in Echtzeit zu ändern
4. Halten Sie den Stil in der Linie überall.
5. Zwei Zeilen in eine Zeile löschen, um den Stil aufrechtzuerhalten.
6. Textstile in Echtzeit mit dem Cursor auf das Bedienfeld anzeigen.
7. Styles an jeder Position einfügen
8. Der endgültige Bearbeitungstext wird auf Markdown übertragen (es gibt Fehler ~ ...)
Warten. . .
Für die Implementierung von Recyclerview besteht der entsprechende Betrieb der Wagenrendite zum Hinzufügen eines Modells. Daher erfordert die Wickelzeilen- und Löschungsverpackung und das Löschen viel logischer Verarbeitung und beinhaltet auch die Spleißen und Segmentierung von Stilindizes. Kurz gesagt, es ist eine große Grube.
Nach der Auswahl müssen Sie den Cursor indexieren, den Stil klären und teilen und den Stil nachstellen und zuweisen. Große Grube, große Grube.
Wenn der Cursor der Zeichenfolge des entsprechenden Stils entspricht, ändert das folgende Feld den aktuellen Stil in Echtzeit. Es ist notwendig, die logische Beurteilung des Intervalls zu verwenden, um logische Urteile über die Cursor- und Stilintervalle zu fällen, und es gibt immer mehr Fallstricke. . .
Es gibt auch viele komplexe interaktive Verarbeitung, die hier nicht angezeigt werden. Sie können den Quellcode für Details überprüfen.
Reichtum
Das Projekt wird hier nicht in Jitpack veröffentlicht, denn als reichhaltiger Texteditor hat jeder seine eigenen Bedürfnisse und Interaktionsmethoden, und es gibt keine Möglichkeit, einen reichhaltigen Text zu erreichen, der alle Anforderungen erfüllen kann. Und da die Interaktionslogik der reichen Texteditoren tatsächlich komplex ist, ist es unmöglich, die Kompatibilität mit allen Interaktionen und Situationen zu gewährleisten. Hier tun wir hier nur unser Bestes, um die Interaktionssituation zu implementieren.
1. Führen Sie die LIB des Editors in Project 2.xml ein, um den Editor hinzuzufügen
<com.study.xuan.editor.widget.Editor
android:id="@+id/editor"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Es wird normal verwendet.
Es ist so einfach, dass es eingekapselt und zur Verwendung von RichHelper verwendet wird
//绑定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, die zugrunde liegende Architektur, hilft bei der Umsetzung der Gesamtfunktionen von Richeditor.
Der Implementierungsklassen -PanelBuilder enthält zwei Implementierungsklassen. FontParambuilder repräsentiert den Stil des Charaktertyps und der Absatzstil repräsentiert den Stil des Absatztyps. Die Kommunikationsmethode zwischen Panle und Editor erfolgt über das Ipanel im zugrunde liegenden Richbuilder Singleton.
Abstract Engineering -Klasse, verwendet, um Spanntypen in der Außenschicht zu erstellen. Unter ihnen sind abstrakte Fabriken in drei Fabriken unterteilt: iCharacterStyleFactory, iParagraphfactory und iUpDateAppearanceFactory, die dem Charakterfaktor (Charakterstil -Fabrik), Absatz (Absatzfabrik) entsprechen und (benutzerdefinierte Fabrik nicht implementiert).
Die Suchstrategie wird verwendet, um Stile in einem bestimmten Absatz zu durchqueren und zu verarbeiten. NormalSearch implementiert ISEARSESTRATEGY und verwendet eine regelmäßige Durchlaufverarbeitung (kann eine schnelle Sortierung oder andere effiziente Sortiermethoden zur Verarbeitung anpassen)
Die Parameterverwaltungsschnittstelle implementiert den Parammanager, der der Klasse entspricht, mit der der aktuelle Stil und den Vorinput-Stil verglichen und verarbeitet wird.
Die Editor -Implementierungsklasse, die von Recyclerview geerbt wurde, entspricht dem Richadapter und dem Modell entspricht RichModel.
Eingabefilter für die Stilverarbeitung bei Eingabe und Löschen.
Spannstep1Filter
Der Filter der ersten Stufe wird verwendet, um die Verarbeitung von SPAN_EXCLUSIVE_INCLUSIVE und SPAN_EXCLUSIVE_EXCLUSIVE zu verarbeiten, wenn die Handhabungsstil-Anhänge und -verwirrungen verarbeitet werden.
Spannstep2Filter
Der Filter der zweiten Ebene wird verwendet, um die Erstellung und Wartung von Stilen zu verarbeiten, alle Stilsätze des aktuellen Textes zu erhalten und den entsprechenden Index des Stils aufzuzeichnen und ihn im entsprechenden Richmodel zu verwalten.
Asynchrone Verarbeitung, verwendet, um die Umwandlung von Daten in den entsprechenden Konvertierungsart zu verarbeiten.
Analysieren
Konvertieren der Schnittstelle
MarkdownParse
Die logische Verarbeitung in die Markdown -Syntax unter Verwendung regelmäßiger Ausdrücke konvertiert.
Datenverarbeitungsklasse unter Verwendung der Datenverarbeitung in Bezug auf Verschmelzungsstile, Verarbeitungsstile usw.
Das Panel repräsentiert das Bedienfeld und das Panel verwendet standardmäßig EditorPanelalpha. Das Panel wird über Ipanel in Richbuilder implementiert, um den Editor zu verknüpfen.
[2018.3.17]: Reiche Textbearbeitung innerhalb einer Textzeile.
[2018.3.19]: Vervollständigen Sie die Löschung mehrerer Textzeilen, fügen Sie eine Zeile hinzu und löschen Sie die nächste Zeile zur vorherigen Zeile. Und Stil halten.
[2018.3.20]: Vervollständigen Sie die Löschung und Addition mehrerer Textzeilen, einschließlich der ersten Löschlinie und der Inline-Eingabe, wobei der reiche Textstil mit dem Absatz in Bewegung hält.
[2018.3.24]: Vollständige Synchronisation der Betriebsleiste nach dem Klicken, wobei der aktuelle Textstil und den Betriebsleistenstil einheitlich bleiben.
[2018.3.29]: Vervollständigen Sie die Funktion des Einsetzens neuer Stile und vervollständigen Sie zunächst die grundlegenden Funktionen der Bearbeitung.
[2018.4.09]: Vollständige Funktion des Absatzstils.
[2018.4.11]: vorläufige Fertigstellung der Markdown -Syntax -Flucht.
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.