Editor de texto rico
Considerando que a edição de texto rica precisa suportar tipos de texto longos, a maioria dos textos ricos não pode reutilizar as visualizações usando o único edittExt personalizado. Portanto, o editor de texto rico implementado com base no Recycleview está atualmente em processo de desenvolvimento.
Para a implementação de editores de texto ricos, definitivamente pensaremos em vários recursos necessários que o editor implementado precisa apoiar:
1. Envolve a exibição e a edição de um grande número de texto, imagens e estilos de texto.
2. Envolve interações de usuário extremamente complexas .
O editor de texto rico que conheço no Github é basicamente implementado com base em dois tipos:
Aqui estão algumas opiniões pessoais sobre essas duas soluções.
Primeiro de tudo, uma desvantagem do desempenho da renderização do WebView é. Em segundo lugar, quando envolve interações humano-computador extremamente complexas, será mais difícil implementar o WebView. Outro ponto é que a compatibilidade do WebView também é um ponto que precisa ser considerado.
Para reescrever um único EditText, é realmente muito escalável para interação, renderização de texto e suporte de estilo. No entanto, considerando que haverá um grande número de fotos, a situação da memória precisa ser levada em consideração aqui. Para EdittExt, definitivamente não há reutilização de visualização. Basicamente, tanta memória quanto imagens, é necessário. Por outro lado, o Native TextView sempre foi criticado por renderizar uma grande quantidade de texto, e há muitas soluções para otimização do desempenho do TextView.
Então, acabei optando por usar o RecyclerView como uma solução de implementação para implementar um editor de texto rico. Embora existam armadilhas, também é uma solução viável. (O editor de Douban é implementado usando o RecyclerView)
Vantagens : Primeiro de tudo, a Recyclervie, como componente nativo, tem um desempenho muito bom para a exibição de um grande número de componentes da interface do usuário. Em segundo lugar, o mecanismo de multiplexação da RecyclerView fornece um bom suporte para o controle do consumo de memória.
Desvantagens :: Claro, essa não é a primeira opção para implementar editores de texto ricos. Eu encontrei muitas grandes armadilhas no processo de implementação. Aqui estão alguns:
1. Controle de foco
2. Splicing de dados
3. Armazenamento de estilo
4. A posição do cursor
E muito mais ...
Felizmente, a solução foi encontrada no final, então compartilharei essa solução de implementação aqui e fornecerei uma solução de implementação para as pessoas necessitadas.
1. Bold, itálico, sublinhado, midscore, striketrough, hiperlink, estilo de referência, H1, H2, H3, H4 do texto.
2. Insira e exclua fotos
3. Selecione o texto para mudar o estilo em tempo real
4. Mantenha o estilo de embrulho em qualquer lugar.
5. Exclua duas linhas em uma linha para manter o estilo.
6. Exibir estilos de texto em tempo real com o cursor ao painel de controle.
7. Insira estilos em qualquer posição
8. O texto de edição final é transferido para o Markdown (existem bugs ~ ...)
espere. . .
Para a implementação do RecyclerView, a operação correspondente do retorno do carro é adicionar um modelo, portanto, o embrulho e a exclusão da linha de retorno do transporte requer muito processamento lógico e também envolve a emenda e a segmentação dos índices de estilo. Em suma, é um grande poço.
Depois de selecionar, você precisa indexar o cursor, estilo, limpar e dividir o estilo, recriar e atribuir o estilo. Big Pit, Big Pit.
Quando o cursor corresponde à sequência do estilo correspondente, o painel abaixo altera o estilo atual em tempo real. É necessário usar o julgamento lógico do intervalo para fazer julgamentos lógicos nos intervalos de cursor e estilo, e há cada vez mais armadilhas. . .
Também existem muitos processos interativos complexos, que não são exibidos aqui. Você pode verificar o código -fonte para obter detalhes.
Richeditor
O projeto não é publicado para Jitpack aqui, porque, como editor de texto rico, todo mundo tem suas próprias necessidades e métodos de interação exclusivos, e não há como obter um texto rico que possa atender a todas as necessidades. E como a lógica de interação dos editores de texto rico é realmente complexa, é impossível garantir a compatibilidade com todas as interações e situações, então aqui fazemos o possível para implementar a situação de interação.
1. Apresente a lib do editor no Projeto 2.xml para adicionar editor
<com.study.xuan.editor.widget.Editor
android:id="@+id/editor"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Será usado normalmente.
É tão simples que está encapsulado e 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);
}
A Global Singleton, a arquitetura subjacente, ajuda a implementar as funções gerais do RichEditor.
A classe de implementação Panelbuilder contém duas classes de implementação. O FontParambuilder representa o estilo do tipo de personagem e do parágrafo que representa o estilo do tipo de parágrafo. O método de comunicação entre Panle e Editor é através do iPanel no Richbuilder Singleton subjacente.
Classe de engenharia abstrata, usada para criar tipos de extensão na camada externa. Entre eles, as fábricas abstratas são divididas em três fábricas de extensão: icharacterstylefactory, iparagraphFactory e iUpDatePearanceFactory, que correspondem à fábrica de caracteres (Fábrica de Estilo de Personagem), paragraffactory (fábrica de estilo parágrafo) e (fábrica personalizada não implementada).
A estratégia de pesquisa é usada para atravessar e processar estilos de extensão em um determinado parágrafo. O NormalSearch implementa o ISearchStrategy e usa o processamento de travessia regular (pode personalizar a classificação rápida ou outros métodos de classificação eficientes para processamento)
Interface de gerenciamento de parâmetros, implementa o paramManager correspondente à classe, que é usada para comparar e processar o estilo atual e o estilo de pré-entrada.
A classe de implementação do editor, herdada da RecyclerView, adaptador corresponde a Richadapter e o modelo corresponde ao RichModel.
Filtro de entrada para processamento de estilo quando entrada e exclusão.
SpanStep1Filter
O filtro de primeiro nível é usado para lidar com o processamento de SPAN_EXCLUSIVE_INCLUSIVE e SPAN_EXCLUSIVE_EXCLUSIVE ao manusear o estilo de manuseio e confusões.
SpanStep2Filter
O filtro de segundo nível é usado para lidar com a criação e manutenção de estilos, para obter todos os conjuntos de estilos do texto atual e registrar o índice correspondente do estilo e mantê-lo no RichModel correspondente.
Processamento assíncrono, usado para processar a conversão de dados no tipo de conversão correspondente.
Analisar
Interface de conversão
MarkdownParse
Processamento lógico convertido em sintaxe de marcação, usando expressões regulares.
Classe de processamento de dados, usando o processamento de dados relacionado a estilos de mesclagem, estilos de processamento, etc.
O painel representa o painel de operação e o painel usa EditorPanelalpha por padrão. O painel é implementado através do iPanel no RichBuilder para vincular o editor.
[2018.3.17]: Edição de texto rico em uma linha de texto.
[2018.3.19]: Complete a exclusão de várias linhas de texto, adicione uma linha e exclua a próxima linha à linha anterior. E mantenha o estilo.
[2018.3.20]: Complete a exclusão e a adição de várias linhas de texto, incluindo a primeira linha de exclusão e a entrada em linha, mantendo o estilo de texto rico em movimento com o parágrafo.
[2018.3.24]: Sincronização completa da barra de operação após clicar, mantendo o estilo atual de texto e o estilo da barra de operação unificado.
[2018.3.29]: Conclua a função de inserir novos estilos e concluir inicialmente as funções básicas da edição.
[2018.4.09]: Função completa do estilo de parágrafo.
[2018.4.11]: Conclusão preliminar da escape de sintaxe de marcação.
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.