本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
安卓支持自定义富文本控件
manongba · 566浏览量 · 发布于2019-12-26 +关注

作者yangchong211,源码YCCustomText,自定义文本控件,支持富文本,包含两种状态:编辑状态和预览状态。编辑状态中,可以对插入本地或者网络图片,可以同时插入多张有序图片和删除图片,支持图文混排,并且可以对文字内容简单操作加粗字体,设置字体下划线,支持设置文字超链接(超链接支持跳转),支持字数和图片数量统计,功能正在开发中和完善中……


01.目录介绍

  • 01.富文本控件介绍

  • 02.业务需求简单介绍

  • 03.富文本支持功能

  • 04.富文本实现方案

  • 05.富文本如何使用

  • 06.富文本开发步骤

  • 07.富文本遗留问题

  • 08.其他说明介绍


02.业务需求简单介绍

  • 富文本控件支持动态插入文字,图片等图文混排内容。图片可以支持本地图片,也支持插入网络链接图片;

  • 富文本又两种状态:编辑状态 + 预览状态 。两种状态可以相互进行切换;

  • 富文本在编辑状态,可以同时选择插入超过一张以上的多张图片,并且可以动态设置图片之间的top间距;

  • 在编辑状态,支持利用光标删除文字内容,同时也支持用光标删除图片;

  • 在编辑状态,插入图片后,图片的宽度填充满手机屏幕的宽度,然后高度可以动态设置,图片是剧中裁剪显示;

  • 在编辑状态,插入图片后,如果本地图片过大,要求对图片进行质量压缩,大小压缩;

  • 在编辑状态,插入多张图片时,添加插入过渡动画,避免显示图片生硬。结束后,光标移到插入图片中的最后一行显示;

  • 编辑状态中,图片点击暴露点击事件接口,可以在4个边角位置动态设置一个删除图片的功能,点击删除按钮则删除图片;

  • 连续插入多张图片时,比如顺序1,2,3,注意避免出现图片插入顺序混乱的问题(异步插入多张图片可能出现顺序错乱问题);

  • 在编辑富文本状态的时候,连续多张图片之间插入输入框,方便在图片间输入文本内容;

  • 在编辑状态中,可以设置文字大小和颜色,同时做好拓展需求,后期可能添加文本加粗,下划线,插入超链接,对齐方式等功能;

  • 编辑状态,连续插入多张图片,如果想在图片中间插入文字内容,则需要靠谱在图片之间预留编辑文本控件,方便操作;

  • 支持对文字选中的内容进行设置加粗,添加下划线,改变颜色,设置对齐方式等等;

03.富文本支持功能

  • 支持加粗、斜体、删除线、下划线行内样式,一行代码即可设置文本span属性,十分方便

  • 支持添加单张或者多张图片,并且插入过渡动画友好,同时可以保证插入图片顺序

  • 支持富文本编辑状态和预览状态的切换,支持富文本内容转化为json内容输出,转化为html内容输出

  • 支持设置富文本的文字大小,行间距,图片和文本间距,以及插入图片的宽和高的属性

  • 图片支持点击预览,支持点击叉号控件去除图片,暴露给外部开发者调用。同时加载图片的逻辑也是暴露给外部开发者,充分解耦

  • 关于富文本字数统计,由于富文本中包括文字和图片,因此图片和文字数量统计分开。参考易车是:共n个文字,共n个图片显示

04.富文本实现方案

4.0 页面构成分析

  • 整个界面的要求

    • 整体界面可滚动,可以编辑,也可以预览

    • 内容可编辑可以插入文字、图片等。图片提供按钮操作

    • 软键盘删除键可删除图片,也可以删除文字内容

    • 文字可以修改属性,比如加粗,对齐,下划线

  • 根据富文本作出以下分析

    • 使用原生控件,可插入图片、文字界面不能用一个EditText来做,需要使用LinearLayout添加不同的控件,图片部分用ImageView,界面可滑动最外层使用ScrollView。

    • 使用WebView+js+css方式,富文本格式用html方式展现,比较复杂,对标签要非常熟悉才可以尝试使用

  • 使用原生控件多焦点问题分析

    • 如何处理记录当前的焦点区域

    • 如何处理在文字区域的中间位置插入ImageView样式的拆分和合并

    • 如何处理输入区域的删除键处理

    • 界面是由多个输入区域拼接而成,暂且把输入区域称为EditText,图片区域称为ImageView,外层是LinearLayout。

    • 如果一个富文本是:文字1+图片1+文字2+文字3+图片3+图片4;那么使用LinearLayout包含多个EditText实现的难点:

4.1 第一种方案

  • 使用ScrollView作为最外层,布局包含LineaLayout,图文混排内容,则是用TextView/EditText和ImageView去填充。

  • 富文本编辑状态:ScrollView + LineaLayout + n个EditText+Span + n个ImageView

  • 富文本预览状态:ScrollView + LineaLayout + n个TextView+Span + n个ImageView

  • 删除的时候,根据光标的位置,如果光标遇到是图片,则可以用光标删除图片;如果光标遇到是文字,则可以用光标删除文字

  • 当插入或者删除图片的时候,可以添加一个过渡动画效果,避免直接生硬的显示。如何在ViewGroup中添加view,删除view时给相应view和受影响的其他view添加动画,不太容易做。如果只是对受到影响的view添加动画,可以通过设置view的高度使之显示和隐藏,还可以利用ScrollView通过滚动隐藏和显示动画,但其他受影响的view则比较难处理,最终选择布局动画LayoutTransition 就可以很好地完成这个功能。

4.2 第二种方法

  • 使用WebView实现编辑器,支持n多格式,例如常见的html或者markdown格式。利用html标签对富文本处理,这种方式就需要专门处理标签的样式。

  • 注意这种方法的实现,需要深入研究js,css等,必须非常熟悉才可以用到实际开发中,可以当作学习一下。这种方式对于图片的显示和上传,相比原生要麻烦一些。

05.富文本如何使用

  • 如何引用

    implementation 'cn.yc:YCCustomTextLib:2.1.2'
  • 在布局中引用,HyperTextEditor是编辑富文本,HyperTextView是预览富文本

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:ignore="MissingDefaultResource">
    
        <com.ns.yc.yccustomtextlib.edit.view.HyperTextEditor
            android:id="@+id/hte_content"
            android:visibility="visible"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white"
            android:textSize="16sp"
            app:editor_text_line_space="6dp"
            app:editor_image_height="500"
            app:editor_image_bottom="10"
            app:editor_text_init_hint="在这里输入内容"
            app:editor_text_size="16sp"
            app:editor_text_color="@android:color/black"/>
    
    
        <com.ns.yc.yccustomtextlib.edit.view.HyperTextView
            android:id="@+id/htv_content"
            android:visibility="gone"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:ht_view_text_line_space="6dp"
            app:ht_view_image_height="0"
            app:ht_view_image_bottom="10"
            app:ht_view_text_size="16sp"
            app:ht_view_text_color="@android:color/black"/>
    
    </LinearLayout>
  • 在编辑富文本状态时,HyperTextEditor控件

    //插入图片
    hte_content.insertImage(imagePath);
    //对外提供的接口, 生成编辑数据上传
    List<HyperEditData> editList = hte_content.buildEditData();
    
    hte_content.setOnHyperListener(new OnHyperEditListener() {
        @Override
        public void onImageClick(View view, String imagePath) {
            //图片点击事件
        }
    
        @Override
        public void onRtImageDelete(String imagePath) {
            //图片删除事件
        }
    });
    hte_content.setOnHyperChangeListener(new OnHyperChangeListener() {
        @Override
        public void onImageClick(int contentLength, int imageLength) {
            //富文本的文字数量,图片数量统计
            tv_length.setText("文字共"+contentLength+"个字,图片共"+imageLength+"张");
        }
    });
  • 在预览富文本状态时,HyperTextView控件

    //清除所有文本
    htv_content.clearAllLayout();
    //将html数据转化成集合
    List<String> textList = HyperLibUtils.cutStringByImgTag(html);
    //省略部分代码,具体看demo
    if (text.contains("<img") && text.contains("src=")) {
        //imagePath可能是本地路径,也可能是网络地址
        String imagePath = HyperLibUtils.getImgSrc(text);
        //在特定位置添加ImageView
        htv_content.addImageViewAtIndex(htv_content.getLastIndex(), imagePath);
    } else {
        //在特定位置插入TextView
        htv_content.addTextViewAtIndex(htv_content.getLastIndex(), text);
    }
    
    htv_content.setOnHyperTextListener(new OnHyperTextListener() {
        @Override
        public void onImageClick(View view, String imagePath) {
            //图片点击事件
        }
    });
  • 关于HyperTextEditor的属性介绍说明

    <declare-styleable name="HyperTextEditor" >
        <!--父控件的左和右padding-->
        <attr name="editor_layout_right_left" format="integer" />
        <!--父控件的上和下padding-->
        <attr name="editor_layout_top_bottom" format="integer" />
        <!--插入的图片显示高度-->
        <attr name="editor_image_height" format="integer" />
        <!--两张相邻图片间距-->
        <attr name="editor_image_bottom" format="integer" />
        <!--文字相关属性,初始提示信息-->
        <attr name="editor_text_init_hint" format="string" />
        <!--文字大小-->
        <attr name="editor_text_size" format="dimension" />
        <!--文字颜色-->
        <attr name="editor_text_color" format="color" />
        <!--文字行间距-->
        <attr name="editor_text_line_space" format="dimension" />
    </declare-styleable>

06.富文本开发步骤

  • 01.业务需求简单介绍

  • 02.实现的方案介绍

  • 03.异常状态下保存状态信息

  • 04.处理软键盘回删按钮逻辑

  • 05.在指定位置插入图片

  • 06.在指定位置插入输入文字

  • 07.如果对选中文字加粗

  • 08.利用Span对文字属性处理

  • 09.如何设置插入多张图片

  • 10.如何设置插入网络图片

  • 11.如何避免插入图片OOM

  • 12.如何删除图片或者文字

  • 13.删除和插入图片添加动画

  • 14.点击图片可以查看大图

  • 15.如何暴露设置文字属性方法

  • 16.文字中间添加图片注意事项

  • 17.键盘弹出和收缩优化

  • 18.前后台切换编辑富文本优化

  • 19.合理运用面向对象编程思想

  • 20.用的设计模式介绍

  • 21.生成html片段上传服务器

  • 22.生成json片段上传服务器

  • 23.图片上传策略问题思考

  • 更多信息

07.富文本遗留问题

08.其他说明介绍


源码使用过程中,如无法搭建或有增加其他功能需求,可联系QQ:236-0248-666 ,付费搭建安装修改服务!
温馨提示:网站源码只作为学习或研究使用,如需商业使用请购买正版!

相关推荐

SplitEditText是一个灵活的分割编辑框

相关信息 程序猿小军 · 575浏览 · 2021-02-19 10:06:14
类似抖音评论弹框功能源码

相关信息 奔跑的男人 · 553浏览 · 2020-11-05 09:18:35
类似微信支付宝的密码输入框 安卓

相关信息 kenrry1992 · 729浏览 · 2019-10-21 14:28:26
Android 带有删除功能的文本输入框源码

相关信息 冷月葬花魂 · 732浏览 · 2019-10-10 15:59:33
Android,自定义控价,用于显示描述内容和标题源码

相关信息 冷月葬花魂 · 673浏览 · 2019-09-17 11:52:26
自动格式化银行卡号的文本输入框 安卓源码

相关信息 冷月葬花魂 · 791浏览 · 2019-09-06 15:23:12
带收缩和展开的简单自定义文字视图 安卓源码

相关信息 飘飘悠悠 · 700浏览 · 2019-08-26 17:31:28
仿手机支付宝支付数字密码输入验证 安卓

相关信息 冷月葬花魂 · 772浏览 · 2019-08-26 17:09:48
加载中

0评论

评论
  • 源码信息
  • 所需 2 点数
  • 源码作者:匿名作者
  • 源码大小:479.806 KB
  • 源码类型:android源码
  • 显示语言: 简体中文
  • 运行环境:未知
分类专栏
小鸟云服务器
扫码进入手机网页