Editor de texto rico
Teniendo en cuenta que la edición de texto enriquecida debe admitir tipos de texto largos, la mayoría de los textos ricos no pueden reutilizar vistas utilizando un single edittext personalizado. Por lo tanto, el editor de texto enriquecido implementado basado en RecycleView se encuentra actualmente en el proceso de desarrollo.
Para la implementación de editores de texto enriquecidos, definitivamente pensaremos en varias características necesarias que el editor implementado necesita admitir:
1. Implica la visualización y la edición de una gran cantidad de texto, imágenes y estilos de texto.
2. Involucra interacciones de usuario extremadamente complejas .
El editor de texto enriquecido que conozco en GitHub se implementa básicamente en función de dos tipos:
Aquí hay algunas opiniones personales sobre estas dos soluciones.
En primer lugar, una desventaja de la representación del rendimiento de WebView es. En segundo lugar, cuando involucra interacciones humanas extremadamente complejas, será más difícil implementar WebView. Otro punto es que la compatibilidad de WebView también es un punto que debe considerarse.
Para reescribir un solo EditText, de hecho es muy escalable para la interacción, la representación de texto y el soporte de estilo. Sin embargo, teniendo en cuenta que habrá una gran cantidad de imágenes, la situación de la memoria debe tenerse en cuenta aquí. Para EditText, definitivamente no hay reutilización de vistas. Básicamente, tanta memoria como hay imágenes, requiere. Por otro lado, TextView nativo siempre ha sido criticado por representar una gran cantidad de texto, y hay muchas soluciones para la optimización del rendimiento de TextView.
Así que terminé eligiendo usar RecyclerView como una solución de implementación para implementar un editor de texto enriquecido. Aunque hay dificultades, también es una solución factible. (El editor de Douban se implementa utilizando RecyclerView)
Ventajas : en primer lugar, Recyclervie, como componente nativo, tiene un muy buen rendimiento para la visualización de una gran cantidad de componentes de UI. En segundo lugar, el mecanismo de multiplexación de RecyclerView proporciona un buen soporte para el control del consumo de memoria.
Desventajas :: Por supuesto, esta no es la primera opción para implementar editores de texto ricos. He encontrado muchas grandes dificultades en el proceso de implementación. Aquí hay algunos:
1. Control de enfoque
2. Empalme de datos
3. Almacenamiento de estilo
4. La posición del cursor
Y mucho más ...
Afortunadamente, la solución se encontró al final, por lo que compartiré esta solución de implementación aquí y proporcionaré una solución de implementación para las personas necesitadas.
1. Bold, cursiva, subrayado, midscore, strikethrough, hipervínculo, estilo de referencia, H1, H2, H3, H4 del texto.
2. Inserte y elimine imágenes
3. Seleccione texto para cambiar el estilo en tiempo real
4. Mantenga el estilo en línea en cualquier lugar.
5. Elimine dos líneas en una línea para mantener el estilo.
6. Muestre estilos de texto en tiempo real con el cursor al panel de control.
7. Inserte estilos en cualquier posición
8. El texto de edición final se transfiere a Markdown (hay errores ~ ...)
esperar. . .
Para la implementación de RecyclerView, la operación correspondiente del retorno del carro es agregar un modelo, por lo que el envoltorio y la eliminación de la línea de retorno del carro requieren mucho procesamiento lógico, y también implica el empalme y la segmentación de los índices de estilo. En resumen, es un gran pozo.
Después de seleccionar, debe indexar el cursor, estilo, borrar y dividir el estilo, y recrear y asignar el estilo. Big Pit, Big Pit.
Cuando el cursor corresponde a la cadena del estilo correspondiente, el siguiente panel cambia el estilo actual en tiempo real. Es necesario utilizar el juicio lógico del intervalo para hacer juicios lógicos sobre los intervalos de cursor y estilo, y hay más y más dificultades. . .
También hay muchos procesos interactivos complejos, que no se muestra aquí. Puede verificar el código fuente para obtener más detalles.
Rico
El proyecto no se publica a Jitpack aquí, porque como editor de texto rico, todos tienen sus propias necesidades y métodos de interacción únicos, y no hay forma de lograr un texto rico que pueda satisfacer todas las necesidades. Y dado que la lógica de interacción de los editores de texto enriquecidos es realmente compleja, es imposible garantizar la compatibilidad con todas las interacciones y situaciones, por lo que aquí solo hacemos todo lo posible para implementar la situación de interacción.
1. Introducir el editor Lib al Proyecto 2.xml para agregar editor
<com.study.xuan.editor.widget.Editor
android:id="@+id/editor"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Se usará normalmente.
Es tan simple que está encapsulado y usado para usar 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, la arquitectura subyacente, ayuda a implementar las funciones generales de RichEditor.
El constructor de panel de la clase de implementación contiene dos clases de implementación. FontParambuilder representa el estilo de tipo de personaje y el párrafo representa el estilo del tipo de párrafo. El método de comunicación entre Panle y Editor es a través del iPanel en el RichBuilder Singleton subyacente.
Clase de ingeniería abstracta, utilizada para crear tipos de span en la capa externa. Entre ellas, las fábricas abstractas se dividen en tres fábricas de span: IcharacterstyleFactory, iParagraphFactory e iUpdatApepopeFactory, que corresponden a lafactory de caracteres (estilo de estilo de estilo de caracteres), párrafo (fábrica de estilo párrafo) y (fábrica personalizada no implementada).
La estrategia de búsqueda se utiliza para atravesar y procesar estilos de tramo en un cierto párrafo. Normalsearch implementa iSearchStrategy y utiliza procesamiento transversal regular (puede personalizar una clasificación rápida u otros métodos de clasificación eficientes para el procesamiento)
Interfaz de administración de parámetros, implementa el parammanager correspondiente a la clase, que se utiliza para comparar y procesar el estilo actual y el estilo previo a la entrada.
La clase de implementación del editor, heredada de RecyclerView, el adaptador corresponde a Richadapter y el modelo corresponde a RichModel.
Filtro de entrada para el procesamiento de estilo cuando la entrada y la eliminación.
Spanstep1filter
El filtro de primer nivel se utiliza para manejar el procesamiento de SPAN_EXCLUSIVE_INCLUSIVE y SPAN_EXCLUSIVE_EXCLUSIVE al manipular el estilo y las confusiones.
Spanstep2filter
El filtro de segundo nivel se utiliza para manejar la creación y mantenimiento de los estilos, para obtener todos los conjuntos de estilo del texto actual y para registrar el índice correspondiente del estilo y mantenerlo en el rico correspondiente.
Procesamiento asincrónico, utilizado para procesar la conversión de datos al tipo de conversión correspondiente.
Analizar gramaticalmente
Interfaz de conversión
Parada
Procesamiento lógico convertido en sintaxis de Markdown, utilizando expresiones regulares.
Clase de procesamiento de datos, utilizando el procesamiento de datos relacionado con estilos de fusión, estilos de procesamiento, etc.
El panel representa el panel de operación y el panel utiliza EditorPanelalpha de forma predeterminada. El panel se implementa a través de Ipanel en RichBuilder para vincular el editor.
[2018.3.17]: Edición de texto enriquecida dentro de una línea de texto.
[2018.3.19]: complete la eliminación de múltiples líneas de texto, agregue una línea y elimine la siguiente línea a la línea anterior. Y guarda el estilo.
[2018.3.20]: complete la eliminación y la adición de múltiples líneas de texto, incluida la primera línea de eliminación y la entrada en línea, manteniendo el estilo de texto rico en movimiento con el párrafo.
[2018.3.24]: Sincronización completa de la barra de operaciones después de hacer clic, manteniendo el estilo de texto actual y el estilo de la barra de operación unificado.
[2018.3.29]: Complete la función de insertar nuevos estilos e inicialmente completar las funciones básicas de edición.
[2018.4.09]: función de estilo de párrafo completo.
[2018.4.11]: Finalización preliminar de la sintaxis de 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.