Anroid富文本的实现

  • 支持设置字体大小
  • 支持设置字体大小
  • 支持设置预览提示文字
  • 支持设置、取消设置,粗体
  • 支持设置、取消设置,斜体
  • 支持设置、取消设置,下划线
  • 支持增加分隔线
  • 支持插入图片(插入图片url)
  • 支持撤销、取消撤销,上一步操作
  • 支持清空所有内容
  • 支持上传图片
  • 支持回显
  • 支持光标移动回显已设置的属性项
  • 支持字体大小改变监听

正文

  1. 定义操作接口和字体大小枚举
public interface ILinghitRichEditor {
    /**
     * 依附WebView,在WebView创建时会调用
     */
    void attachWebView(WebView webView);

    /**
     * 分发onDestroy事件,需要外部调用,在Activity和Fragment的onDestroy()时调用,内部会将文件、图片上传等任务移除
     */
    void dispatchDestroy();

    //----------> 核心方法 <----------

    /**
     * 设置H标签的等级大小,这个字体大小是全局的,不能指定某个字体大或小
     *
     * @param sizeEnum 等级枚举
     */
    void setTitleSize(TitleSizeEnum sizeEnum);

    /**
     * 恢复到默认字体大小
     */
    void setDefaultTitleSize();

    /**
     * 获取当前设置的字体大小
     */
    TitleSizeEnum getCurrentTitleSize();

    /**
     * 设置窗体大小
     */
    void setFrameSize(int width, int height);

    /**
     * 设置预览文字
     */
    void setTextPlaceholder(String placeholder);

    /**
     * 设置或取消粗体
     */
    void toggleBold();

    /**
     * 设置或取消斜体
     */
    void toggleItalic();

    /**
     * 设置或取消下划线
     */
    void toggleUnderline();

    /**
     * 增加分割线
     */
    void addDivider();

    /**
     * 设置或取消删除线
     */
    void toggleDeleteLine();

    /**
     * 直接插入图片Url,这里插入图片,需要先上传到图片服务器后,再将图片的完整Url地址传过来,在WebView中加载
     */
    void insertImages(String... imgUrls);

    /**
     * 以路径形式批量插入图片
     *
     * @param uploadOption   上传配置
     * @param compressOption 压缩配置
     * @param uploadCallback 上传回调
     */
    void insertImages(
            LinghitRichEditorUploadOption uploadOption,
            LinghitRichEditorImageCompressOption compressOption,
            LinghitRichEditorImageCompressCallback uploadCallback);

    /**
     * 批量取消上传任务
     *
     * @param uploadTag 上传时,指定的Tag
     */
    void cancelUploadFileTasks(Object... uploadTag);

    /**
     * 批量取消压缩图片任务
     *
     * @param imageCompressTag 图片压缩时指定的Tag,如果是上传图片,则需要传
     */
    void cancelCompressImageTasks(String... imageCompressTag);

    /**
     * 撤销
     */
    void undo();

    /**
     * 取消撤销
     */
    void redo();

    /**
     * 清除所有内容
     */
    void clearAll();

    //----------> 一些基础方法 <----------

    /**
     * 设置要加载的Html,一般用于后台返回Html后,重新渲染
     *
     * @param contents 后台返回的Html
     */
    void setHtml(String contents);

    /**
     * 获取正在展示的Html
     */
    void getHtml(OnMethodResultCallback methodResultCallback);

    /**
     * 获取指定位置插入的图片的Url
     *
     * @param position 位置
     */
    void getInsertImgUrl(int position, OnMethodResultCallback callback);

    //----------> 回调接口 <----------

    interface AfterInitialLoadListener {
        /**
         * 加载完成的回调
         *
         * @param isReady 是否已经准备好了
         */
        void onAfterInitialLoad(boolean isReady);
    }

    /**
     * 调用JS方法获取返回值的监听
     */
    interface OnMethodResultCallback {
        /**
         * 返回值返回时回调
         *
         * @param result 函数返回值
         */
        void onMethodResult(String result);
    }

    /**
     * 光标移动时回调
     */
    interface OnCursorMoveListener {
        /**
         * 光标移动时回调
         *
         * @param isBold       是否为粗体
         * @param isItalic     是否为斜体
         * @param isUnderline  是否为下划线
         * @param isDeleteLine 是否为删除线
         * @param currentFont  当前Font
         */
        void onCursorMove(boolean isBold, boolean isItalic, boolean isUnderline, boolean isDeleteLine, String currentFont);
    }

    /**
     * 字体改变的监听
     */
    interface OnTitleSizeChangeListener {
        /**
         * 当TitleSize发生改变时回调
         *
         * @param beforeTitleSize    之前设置的字体大小
         * @param currentTitleSize   当前设置的字体大小
         * @param isDefaultTitleSize 是否是默认的字体大小
         */
        void onTitleSizeChange(TitleSizeEnum beforeTitleSize, TitleSizeEnum currentTitleSize, boolean isDefaultTitleSize);
    }

    /**
     * 设置WebView初始化加载的监听
     */
    void setOnInitialLoadListener(AfterInitialLoadListener listener);

    /**
     * 是否注册了初始化加载的监听
     *
     * @param listener 监听器
     */
    boolean isRegisterInitialLoadListener(AfterInitialLoadListener listener);

    /**
     * 设置光标移动的监听
     */
    void setOnCursorMoveListener(OnCursorMoveListener onCursorMoveListener);

    boolean isRegisterOnCursorMoveListener(OnCursorMoveListener onCursorMoveListener);

    /**
     * 设置字体大小改变的监听
     */
    void setOnTitleSizeChangeListener(OnTitleSizeChangeListener onTitleSizeChangeListener);
}
  1. 标题文字大小枚举
public enum  TypeEnum {
    /**
     * 操作的种类,粗体、斜体、删除线等
     */
    BOLD("bold"),
    ITALIC("italic"),
    UNDERLINE("underline"),
    DELETE_LINE("deleteline"),
    CURRENT_FONT("currentFont");

    private String mName;

    TypeEnum(String name) {
        this.mName = name;
    }

    public String getName() {
        return mName;
    }

    @Override
    public String toString() {
        return this.mName;
    }
}

  1. 上传、压缩参数(图片上传参数)
public class LinghitRichEditorUploadOption {
    private String mUploadUrl;
    private Map<String, Object> mHeaderMap;
    private Map<String, Object> mParamsMap;
    private String mFileKey;
    private List<File> mFiles;
    private Object mTag;

    private LinghitRichEditorUploadOption(Builder builder) {
        this.mUploadUrl = builder.mUploadUrl;
        this.mHeaderMap = builder.mHeaderMap == null ? new HashMap<String, Object>() : builder.mHeaderMap;
        this.mParamsMap = builder.mParamsMap == null ? new HashMap<String, Object>() : builder.mParamsMap;
        this.mFileKey = builder.mFileKey;
        this.mFiles = builder.mFiles == null ? new ArrayList<File>() : builder.mFiles;
        this.mTag = builder.mTag;
    }

    //...省略get方法

    public static class Builder {
        /**
         * 上传地址Url
         */
        private String mUploadUrl;
        /**
         * 上传时需要带的Header参数,键值对,一般上传会带token验证
         */
        private Map<String, Object> mHeaderMap;
        /**
         * 上传时需要带的字段参数,键值对
         */
        private Map<String, Object> mParamsMap;
        /**
         * 文件上传Key,这里必须是统一的
         */
        private String mFileKey;
        /**
         * 需要上传的文件
         */
        private List<File> mFiles;
        /**
         * 本次上传任务的Tag,需要手动取消上传任务时需要使用Tag来标记
         */
        private Object mTag;

        private Builder() {
        }

        /**
         * 单个文件时,使用该重载
         */
        public static Builder newBuilder(String uploadUrl, String fileKey, File file) {
            ArrayList<File> files = new ArrayList<>();
            files.add(file);
            return new Builder(uploadUrl, fileKey, files);
        }

        /**
         * 同一个Key,多个File文件时,使用该重载
         */
        public static Builder newBuilder(String uploadUrl, String fileKey, File... files) {
            return new Builder(uploadUrl, fileKey, Arrays.asList(files));
        }

        /**
         * 同一个Key,多个File文件的Path
         */
        public static Builder newBuilder(String uploadUrl, String fileKey, String... filePaths) {
            ArrayList<File> files = new ArrayList<>();
            for (String filePath : filePaths) {
                files.add(new File(filePath));
            }
            return new Builder(uploadUrl, fileKey, files);
        }

        /**
         * 后续再追加File参数,也是可以的
         */
        public Builder addFile(String fileKey, File file) {
            this.mFileKey = fileKey;
            if (this.mFiles == null) {
                this.mFiles = new ArrayList<>();
            }
            mFiles.add(file);
            return this;
        }

        public Builder addFile(String fileKey, File... files) {
            this.mFileKey = fileKey;
            if (this.mFiles == null) {
                this.mFiles = new ArrayList<>();
            }
            mFiles.addAll(Arrays.asList(files));
            return this;
        }

        public Builder setTag(Object tag) {
            this.mTag = tag;
            return this;
        }

        public Builder setHeaderMap(Map<String, Object> headerMap) {
            this.mHeaderMap = headerMap;
            return this;
        }

        public Builder addHeader(String key, Object value) {
            if (this.mHeaderMap == null) {
                this.mHeaderMap = new HashMap<>();
            }
            mHeaderMap.put(key, value);
            return this;
        }

        public Builder addHeader(Map<String, Object> headerMap) {
            if (this.mHeaderMap == null) {
                this.mHeaderMap = new HashMap<>();
            }
            mHeaderMap.putAll(headerMap);
            return this;
        }

        public Builder setParamsMap(Map<String, Object> paramsMap) {
            this.mParamsMap = paramsMap;
            return this;
        }

        public Builder addParams(String key, Object value) {
            if (this.mParamsMap == null) {
                this.mParamsMap = new HashMap<>();
            }
            mParamsMap.put(key, value);
            return this;
        }

        public Builder addParams(Map<String, Object> paramsMap) {
            if (this.mParamsMap == null) {
                this.mParamsMap = new HashMap<>();
            }
            mParamsMap.putAll(paramsMap);
            return this;
        }

        public Builder setUploadUrl(String uploadUrl) {
            mUploadUrl = uploadUrl;
            return this;
        }

        public Builder setFilesMap(String key, List<File> files) {
            this.mFiles = files;
            return this;
        }

        /**
         * 必须的3个参数
         *
         * @param uploadUrl 服务器上传的Url
         * @param fileKey   文件key
         * @param files     文件键值对
         */
        public Builder(String uploadUrl, String fileKey, List<File> files) {
            this.mUploadUrl = uploadUrl;
            this.mFileKey = fileKey;
            this.mFiles = files;
        }

        public LinghitRichEditorUploadOption build() {
            return new LinghitRichEditorUploadOption(this);
        }
    }
}

下班了,下次再copy。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值