安卓富文本编辑器

安卓富文本编辑器,第1张

安卓富文本编辑器

自动解析超链接和表情。
但写得不是很满意,仅供参考

public class RichCharSequenceBuilder {

    private CharSequence charSequence;

    private final static String EMPTY_STR = "";
    private final static String HYPERlink_COLOR = "#5CA2AE";

    public RichCharSequenceBuilder() {
        this.charSequence = EMPTY_STR;
    }

    public RichCharSequenceBuilder(@NonNull CharSequence charSequence) {
        this.charSequence = parse(charSequence);
    }

    public void setCharSequence(@NonNull CharSequence charSequence) {
        this.charSequence = parse(charSequence);
    }

    public CharSequence getCharSequence() {
        return this.charSequence;
    }

    public int length() {
        return charSequence.length();
    }

    @NonNull
    public String toString() {
        return charSequence.toString();
    }

    @NonNull
    public RichCharSequenceBuilder append(CharSequence charSequence) {
        CharSequence temp = parse(charSequence);
        SpannableStringBuilder builder = new SpannableStringBuilder();
        this.charSequence = builder.append(this.charSequence).append(temp);
        return this;
    }

    @NonNull
    public RichCharSequenceBuilder appendImage(int drawableId) {
        this.charSequence = appendImage(this.charSequence, length(), drawableId);
        return this;
    }

    @NonNull
    public RichCharSequenceBuilder appendImage(int index, int drawableId) {
        this.charSequence = appendImage(this.charSequence, index, drawableId);
        return this;
    }

    @NonNull
    public RichCharSequenceBuilder appendImage(@NonNull Bitmap bitmap) {
        this.charSequence = appendImage(this.charSequence, length(), bitmap);
        return this;
    }

    @NonNull
    public RichCharSequenceBuilder appendImage(int index, @NonNull Bitmap bitmap) {
        this.charSequence = appendImage(this.charSequence, index, bitmap);
        return this;
    }

    
    @NonNull
    public RichCharSequenceBuilder setTextColor(@NonNull String patternText, @NonNull String color) {

        if (TextUtils.isEmpty(charSequence)) {
            return this;
        }

        if (TextUtils.isEmpty(patternText)) {
            SpannableString result = new SpannableString(charSequence);
            result.setSpan(new ForegroundColorSpan(Color.parseColor(color)), 0, result.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
            this.charSequence = result;
            return this;
        }

        SpannableStringBuilder builder = new SpannableStringBuilder(charSequence);
        Pattern pattern = Pattern.compile(patternText);
        Matcher matcher = pattern.matcher(builder);
        SpannableStringBuilder result = new SpannableStringBuilder();
        int start = 0;
        while (matcher.find()) {
            int startMatch = matcher.start();
            int endMatch = matcher.end();
            if (startMatch > start) {
                result.append(builder.subSequence(start, startMatch));
            }
            start = endMatch;
            String tempPattern = matcher.group(0);
            SpannableString temp = new SpannableString(tempPattern);
            temp.setSpan(patternText, 0, tempPattern.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
            temp.setSpan(new ForegroundColorSpan(Color.parseColor(color)), 0, tempPattern.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
            result.append(temp);
        }

        if (start < builder.length()) {
            result.append(builder.subSequence(start, builder.length()));
        }

        this.charSequence = result;
        return this;
    }

    @NonNull
    private CharSequence parse(CharSequence text) {
        if (TextUtils.isEmpty(text)) {
            return EMPTY_STR;
        }
        CharSequence tempText = parseHyperlink(text);
        tempText = parseEmote(tempText);
        return tempText;
    }

    
    @NonNull
    private CharSequence parseHyperlink(@NonNull CharSequence charSequence) {
        String temp = charSequence.toString();
        if (!TextUtils.isEmpty(temp)) {
            temp = temp.replace("n", "
"); } Spanned spanned = HtmlCompat.fromHtml(temp, HtmlCompat.FROM_HTML_MODE_LEGACY, null, null); SpannableStringBuilder builder = new SpannableStringBuilder(spanned); URLSpan[] urls = builder.getSpans(0, spanned.length(), URLSpan.class); for (URLSpan span : urls) { setlinkClickable(builder, span); } return builder; } @NonNull private CharSequence parseEmote(@NonNull CharSequence charSequence) { return EmoteCenter.getInstance().parseEmote(charSequence); } private void setlinkClickable(SpannableStringBuilder clickableHtmlBuilder, URLSpan urlSpan) { int start = clickableHtmlBuilder.getSpanStart(urlSpan); int end = clickableHtmlBuilder.getSpanEnd(urlSpan); int flags = clickableHtmlBuilder.getSpanFlags(urlSpan); ClickableSpan clickableSpan = new ClickableSpan() { @Override public void onClick(@NonNull View widget) { String url = urlSpan.getURL(); if (!ObjectUtils.isEmpty(url)) { if (url.startsWith("http://") || url.startsWith("https://")) { Uri uri = Uri.parse(url); if (uri != null) { if (AppConfig.isHostLegal(uri.getHost())) { ActivityRouteManager.getInstance().jump(baseApp.getInstance().getApplicationContext(), "qtpage://web?url=" + URLEncoder.encode(url)); } } } else if (url.startsWith("qtpage://")) { ActivityRouteManager.getInstance().jump(baseApp.getInstance().getApplicationContext(), url); } } } @Override public void updateDrawState(@NonNull TextPaint ds) { ds.setUnderlineText(true); ds.setColor(Color.parseColor(HYPERlink_COLOR)); } }; clickableHtmlBuilder.removeSpan(urlSpan); clickableHtmlBuilder.setSpan(clickableSpan, start, end, flags); } @NonNull private CharSequence appendImage(@NonNull CharSequence text, int index, int image) { if (TextUtils.isEmpty(text)) { text = EMPTY_STR; } if (index > text.length()) { return text; } SpannableStringBuilder builder = new SpannableStringBuilder(); String imageText = "IMG"; String marginText = " "; if (index == 0) { builder.append(imageText).append(marginText).append(text); } else if (index == text.length()) { builder.append(text).append(marginText).append(imageText); } else { builder.append(text, 0, index).append(marginText) .append(imageText) .append(marginText).append(text, index + 1, text.length()); } VerticalImageSpan span = new VerticalImageSpan(baseApp.getInstance().getApplicationContext(), image); builder.setSpan(span, index, index + imageText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); return builder; } @NonNull private CharSequence appendImage(@NonNull CharSequence text, int index, @NonNull Bitmap image) { if (TextUtils.isEmpty(text)) { text = EMPTY_STR; } if (index > text.length()) { return text; } SpannableStringBuilder builder = new SpannableStringBuilder(); String imageText = "IMG"; String marginText = " "; if (index == 0) { builder.append(imageText).append(marginText).append(text); } else if (index == text.length()) { builder.append(text).append(marginText).append(imageText); } else { builder.append(text, 0, index).append(marginText) .append(imageText) .append(marginText).append(text, index + 1, text.length()); } VerticalImageSpan span = new VerticalImageSpan(baseApp.getInstance().getApplicationContext(), image); builder.setSpan(span, index, index + imageText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); return builder; } }

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5597262.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存