安卓文本编辑器php cpp,用安卓原生控件封装一个简易的富文本编辑器

最近接到项目需求:移动端原生写一个富文本编辑器。        ( ⊙ o ⊙ )从没遇到过富文本要用原生写的,然后就查阅各种资料。然后结合自己的思路:其实安卓的富文本编辑器就是一个 “容器”。

那么接下来我就带给大家说一说我自定义这个富文本编辑器的思路与实现过程。

·经过查阅资料之后发现:安卓的富文本编辑器就是一个容器,在用户对这个编辑器中的子控件进行操作的时候对这么多的子控件进行控制。 这就是一个简易的富文本编辑器。

1.安卓有一个控件叫做scrollview,这个控件是一个自动扩容并且可以滑动的控件,既然是富文本编辑器,肯定少不了这个。(编辑器中所有的操作都用在这个容器中)

2.紧接着,根据需求得知:我们原生的富文本编辑器里需要输入文字和插入图片,逻辑仅此而已。但是,图片的右上角需要有一个小叉号,用于删除此张图片。那么就先来封装这个小控件。

f49a19eda39404239430ddc5cf266348.png

正如大家所见:封装一个相对布局,图片居中显示,自适应大小,然后在布局的右上角有一个叉号, 那么这个叉号的点击事件就用来处理这个控件的增加和删除。

3.准备工作做好了,接下来就开始封装和处理逻辑。

在封装之前,我们想想需要处理的逻辑和可能遇到的情况:

在初始化这个编辑器之前,我们需要有一个默认的输入框,让用户可以编辑。

用户编辑的过程中需要注意两个地方,用户编辑完一段文字后需要添加一张图片,正常在容器中添加即可;如果用户将光标指在一段文本的中间,那么则需要判断这个光标的位置,然后将文本框中的文字分离,紧接着在分离的文字中间插入图片,然后在图片下面再插入一个文本框,并且将分离完的后半部分文字添加在输入框中。这么以来就完成了图片添加的部分逻辑。

再来说,图片删除的逻辑: 如果用户点击右上角删除图片,那就将整个封装的控件删除;再次判断如果图片上下都是输入框,就合并这两个输入框。

清楚了大致逻辑之后,我们开始封装这个所谓的富文本编辑器。

一、继承scrollview,封装一个自定义组件,并且将需要的组件与变量初始化。(直接上代码)

初始化变量及其构造方法。

2cbee079629801dea8f346fe18e65972.png

在其构造方法中加入出初始化控件时所有需要的子控件,还有子控件的初始化及其监听。

302c3d6a88e79d7b9775b3f9bf96351b.png

437f56f02eb08322c81d368525bce4c3.png

41da6d3a7ac4a42fe7c14e583cd87890.png

以上就是初始化控件之后的一些基本操作,大致意思如下:

1)创建编辑器中的第一个文本输入框Edittext,并且设置其属性,还有监听。这个监听有两个,一个是获取焦点的监听,一个是输入文本内容的监听。

在输入框获取到焦点的时候,需要将默认文字设置成空(产品需求);还有另一个需求就是文本框内不允许输入表情,对于表情android有一套算法,这个算法大概是判断这个文本的占字节数,如果输入的文本中有发现类似的敏感字,就直接删除这个表情,并且提示用户“暂不支持输入表情”。再有就是监听当前光标的位置,然后对退格键进行监听。在代码中都有注释写到的。后续会粘贴出来代码。

2)然后就是对动画的一个初始化,如果用户删除掉图片之后,直接让图片消失会显得很突然,所以我们在其中加入一个动画,来让用户感觉这一个过程不是那么突然,那么粗暴。

-----------------------------------------------------------来一条分割线------------------------------------------------------------

以上是一个简单的初始化,你们一定觉得有点乱,我也觉得有点乱。因为这个容器里面需要做的操作太多了。[流泪]

二、来解析一下当中的逻辑

1)首先看看插入图片的逻辑

首先初始化好这个图片的布局,并且给图片相应的资源。为了后面取值,每一个图片给一个tag标签,这个标签的值就是这个图片加载的url地址。

ff102b8dab9fe2271a24397d7502a0ba.png

其次,要确定这个图片插入的位置,如下代码:

4f72f4f991bde7633ad20a5e07097fff.png

容器是从上往下添加的,那么添加的时候需要注意光标的位置;如果输入框的内容为空,或者光标顶在了输入框的最前面,那就直接添加一个输入框和一张图片;这么以来,就有了一个大编辑器的感觉。  如果这个光标不是在最前面,并且里面还有内容,那就截取光标前后的内容,将光标后面的内容,设置到下面的输入框中,然后再在这两个输入框中间添加图片。  结束完这个操作之后,要判断默认的提示文字要不要显示并且隐藏键盘。(后续会讲解这个默认文字要不要显示的方法)

在这里贴上添加Edittext的方法:

29064f34a78525777ffb9719c659345d.png

最难的逻辑已经分析完了,,,接下来开始处理这个默认文字的显示与隐藏。

2)默认文字的显示与隐藏

这个问题也苦苦调了一段时间,因为如果用户一进来就添加图片,这个时候默认文字也还会显示,这个原因是:android EditText中的属性是判断这个输入框中有没有内容,如果有内容才会消失这个默认文字,在这个过程中还遇到一个问题:如果默认文字太多,他自行换行了,那么就会填充这个输入框的高度,用户体验自然就不好了。  那么在默认文字的处理中,如下:

8b69b86ba4d284601ae22faaf5817f27.png

先给第一个输入框一个tag,这个是第一个默认的,这个也有可能被顶下去,然后可能被删除。   焦点监听:如果有焦点了,就直接把他的默认文字给去掉;如果没有焦点,判断这个容器中是否只有这么一个控件,如果是的话就继续判断 :有焦点就去掉默认提示文字,没有焦点就设置相关默认提示文字; 如果还有其他控件,就走方法里的判断。代码如下:

53a440331df7f76f518688cdc1fc8581.png

如果只有一个控件的话,就判断是不是第一个默认的输入框,是的话就不作处理,不是的话就对其做焦点监听。如果还有其他控件的话,就直接把所有的输入框的 默认提示文字给设置为空。这样一来所有子控件全部正常了。

每次处理完退格的时候都必须这么判断一下,因为要监听容器中的最后一个输入框的状态,才能判断这个默认文字显示还是隐藏。

------------------------------------------------------------------------------------------------------------------------------------------------------------------

这个富文本编辑器的主要逻辑大致就这么多。以下再来一小段代码截图:输出数据的方法。

2ba94fbfe0ac37371b705d9307b619bf.png

将数据存到对象,然后存到集合中。 因为调试数据需要html代码,然后进行转换输出:

516b6d518e39ac0129cc8e6ce7ac2015.png

代码基本上就这么多。。。逻辑也梳理完了, 虽然比较乱吧,,但是都是必经的过程,如果有更好的修改意见,欢迎提出。

最后将View代码附上。

这几显示可能有点乱,大家可以复制到AS或者eclipse上格式化后查看。本文章是修改了网上流行了某个富文本编辑器的改进版,如果侵犯请说明。 因为链接我忘了,,,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python和nltk自然语言处理书评_Python和NLTK自然语言处理

模块1 NLTK基础知识第 1章 自然语言处理简介 31.1 为什么要学习NLP 41.2 从Python的基本知识开始 71.2.1 列表 71.2.2 自助 81.2.3 正则表达式 91.2.4 词典 111.2.5 编写函数 111.3 NLTK 131.4 试一试 181.5 本章小结 18第 2章 文本的整理和清洗 192.…

vue tab切换_iviewUITabs选项卡切换组件

概述 选项卡切换组件,常用于平级区域大块内容的的收纳和展现。源码地址:https://github.com/iview/iview/tree/2.0/src/components/tabs使用: 标签一的内容标签二的内容标签三的内容标签二的内容在源码的tabs文件下有三个文件:ind…

java biginteger 比较大小,java – 打印非常大的BigIntegers

我试图找出与Java 7 x64中的BigIntegers相关的以下问题.我试图计算一个极高功率的数字.代码如下,然后是问题描述.import java.math.BigInteger;public class main {public static void main(String[] args) {// Demo calculation; Desired calculation: BigInteger("4096&…

paypal创建订单后怎么获得id_5步创建Facebook商店(最新版教程)学习如何在Facebook上卖货...

请按照以下步骤设置Facebook商店:步骤1:转到您的Facebook页面并配置Shop页面。步骤2:设置您的商店详细信息。步骤3:配置付款。步骤4:将产品添加到您的Facebook商店。步骤5:管理您的订单。步骤6:…

php 网络图片 转本地,PHP将Base64图片转换为本地图片并保存

PHP将Base64图片转换为本地图片并保存/*** [将Base64图片转换为本地图片并保存]* param [Base64] $base64_image_content [要保存的Base64]* param [目录] $path [要保存的路径]*/function base64_image_content($base64_image_content,$path){//匹配出图片的格式if (preg_matc…

创建索引名称已由现有对象使用_Excel编程周末速成班第3课:Excel对象模型

学习Excel技术,关注微信公众号:excelperfect导语:为了帮助想要快速学会Excel VBA的朋友,特以《Excel Programming Weekend Crash Course》这本书为基础,开始整理一系列资料,在完美Excel社群上分享。一共有3…

php修改htpasswd,用来解析.htpasswd文件的PHP类

.htpasswd 文件示例:user1:{SHA}kGPaD671VNU0OU5lqLiN/h6Q6acuser2:{SHA}npMqPEX3kPQTox/ZckHDrIcQIuser3:{SHA}q1Fh2LTUjjkncp11m0M9WUH5Zrwclass Htpasswd {private $file ;private $salt AynlJ2H.74VEfI^BZElc-Vb6G0ezE9a55-Wj;private function write($pairs …

socket用起始码分割_常用条码Code128码及EAN13码的介绍

在条码打印软件中,设计条码标签时经常用到的码制是Code128码和EAN13码。因为这两种码制比较贴近我们的生活。比如:我们去超市购物,商品上贴的条码标签都是EAN13码,因为EAN13码多用于零售产品包装。而code128码多用于工厂产线&…

matlab在c盘有缓存文件夹吗,win10如何清除C盘缓存文件-win10清除C盘缓存的方法 - 河东软件园...

在电脑的使用过程中我们会发现磁盘的容量会不断减小,更多时候其他磁盘还有很多剩余空间,C盘的存储空间就已经达到极限了。其实在系统的升级和软件的下载中很多文件就会默认储存在C盘,时间久了以后,C盘不仅有软件文件,还…

php 验证码字体居中,自定义验证码图片的宽高后文本垂直水平居中[帝国cms ShowKey.php]-网站程序网...

define(EmpireCMSAdmin,1);define(EmpireCMSAPage,login);define(EmpireCMSNFPage,1);require(../class/connect.php);//绘制居中文本, 对于GD的内置字体function pc_ImageStringCenter($image,$text,$font){//字体大小$width array(1>5,6,7,8,9);$height array(1>6,8,…

python中的常量可以修改吗_深入理解Python变量与常量

变量是计算机内存中的一块区域,变量可以存储规定范围内的值,而且值可以改变。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。常量是一块只读的内存区域,常量一旦被初始化就不能被改变。…

java方法体逻辑不会写怎么办,想自己写框架?不会写Java注解可不行

用注解一时爽,一直用一直爽Java后端开发进入spring全家桶时代后,开发一个微服务提供简单的增删改查接口跟玩泥巴似的非常简单,一顿操作猛如虎,回头一看代码加了一堆注解:Controller Autowired Value,面向注…

联想拯救者y7000加内存条_短测联想拯救者Y7000,到底值不值得买?

7000块左右的笔记本电脑有什么好选择,我相信这是很多人一直纠结的问题,虽然我用过的笔记本很多,但是这个价位的用的少之又少,但随着十代酷睿标压处理器的大量铺货,联想拯救者Y7000进入了我的视线。那到底值不值得买呢&…

php适用于什么服务器,php – 找不到laravel类(适用于localhost但不适用于DO服务器)...

这是一个重复的问题 – 例如:Laravel 4 migrations – class not found但是,我已经尝试了所有解决方案(来自我能找到的每个论坛)并且无法解决这个问题.脚本我在我的本地机器上创建了一个Laravel 4项目 – 添加了一些类,控制器,视图等 – 项目运行良好.然后我将这个新…

python扫雷游戏课程设计小组任务计划与分配表_python实现扫雷游戏

本文为大家分享了python实现扫雷游戏的具体代码,供大家参考,具体内容如下本文实例借鉴mvc模式,核心数据为model,维护1个矩阵,0表无雷,1表雷,-1表已经检测过。本例使用python的tkinter做gui,由于…

时间同步服务器java,Windows 配置时间同步服务器以及配置时间同步间隔

如何修改windows下的时间同步间隔操作步骤如下:打开注册表:在“开始”菜单→“运行”项下(或按WinR)输入“Regedit”进入注册表编辑器。2.修改默认时间服务器IP:展开HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->Services->W…

房价python爬取_python爬取并解析 重庆2015-2019房价走势

1 #! /usr/bin/env python2 #-*- coding:utf-8 -*-34 5 Created on 2019年11月24日67 author: Admin8 910 importrequests11 from lxml importetree12 importtime13 importcsv1415 16 方法名称:spider17 功能: 爬取目标网站,并以源码文本18 参…

PHP递归删除目录面试题,PHP 递归删除目录中文件

/*** 递归删除目录中文件* param $pathname* return bool*/public static function delDir($pathname)//要删除的目录{if(file_exists($pathname)) {if(is_file($pathname)) {unlink($pathname);} else {$dir opendir($pathname);while($filename readdir($dir)) {if($filena…

python中 12_python编程中常用的12种基础知识总结

1、正则表达式替换目标: 将字符串line中的 overview.gif 替换成其他字符串>>> line >>> more.compile(r(?<SRC)"([\w\.])",re.I)>>> mo.sub(r"\1****",line)>>> mo.sub(rreplace_str_\1,line)< /span>>&…

php smarty分页原理,SMARTY分页详解

<?phprequire_once (include/common.inc.php);//这里是个接口common.inc.php里面包函了一些常用到的函数类库以及SMARTYinclude_once(header.php);//调用头部信息,SESSION的信息全都保存在这里,这样做的好处是几乎所有的页面都不需要在开头输入session_start();$smarty new…