Android工具类之TextSpan

本文详细探讨了Android中TextSpan的使用,包括其在文本格式化、富文本展示方面的作用,通过实例解析如何创建和应用TextSpan进行文本高亮、颜色设置等操作,提升UI表现力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class TextSpanUtils {

    // 由一多个
    private static final String START = "start";
    private static final String END = "end";
    private static final String REGEX = "regex";

    public static List<HashMap<String, String>> getStartAndEnd(Pattern pattern,
                                                               CharSequence input) {
        Matcher matcher = pattern.matcher(input);
        List<HashMap<String, String>> list = new ArrayList<>();
        while (matcher.find()) {
            HashMap<String, String> map = new HashMap<>();
            map.put(REGEX, matcher.group());
            map.put(START, matcher.start() + "");
            map.put(END, matcher.end() + "");
            list.add(map);
        }
        return list;
    }

    /**
     * 将传入的String数组包装成Pattern数组
     *
     * @param strs
     * @return
     */
    public static Pattern[] addPattern(String... strs) {
        Pattern[] patterns = new Pattern[strs.length];
        for (int i = 0; i < strs.length; i++) {
            patterns[i] = Pattern.compile(strs[i]);
        }
        return patterns;
    }

    public static SpannableString setForegroundColorSpan(
            SpannableString spannableString, int color, String... strs) {
        setForegroundColorSpan(spannableString, color, addPattern(strs));
        return spannableString;
    }

    public static  SpannableString setUserNameColorSpan(SpannableString spannableString,int color,int start,int end){

        return spannableString;
    }


    public static SpannableString setForegroundColorSpan(
            SpannableString spannableString, int color, Pattern... patterns) {
        for (Pattern pattern : patterns) {
            List<HashMap<String, String>> list = getStartAndEnd(pattern,
                    spannableString);
            for (HashMap<String, String> hashMap : list) {
                int start = Integer.parseInt(hashMap.get(START));
                int end = Integer.parseInt(hashMap.get(END));
                int flags = Spannable.SPAN_EXCLUSIVE_EXCLUSIVE;
                spannableString.setSpan(new ForegroundColorSpan(color), start,
                        end, flags);
            }
        }
        return spannableString;
    }

    public static SpannableString setBackgroundColorSpan(
            SpannableString spannableString, int color, String... strs) {
        setForegroundColorSpan(spannableString, color, addPattern(strs));
        return spannableString;
    }

    public static SpannableString setBackgroundColorSpan(
            SpannableString spannableString, int color, Pattern... patterns) {
        for (Pattern pattern : patterns) {
            List<HashMap<String, String>> list = getStartAndEnd(pattern,
                    spannableString);
            for (HashMap<String, String> hashMap : list) {
                int start = Integer.parseInt(hashMap.get(START));
                int end = Integer.parseInt(hashMap.get(END));
                int flags = Spannable.SPAN_EXCLUSIVE_EXCLUSIVE;
                spannableString.setSpan(new BackgroundColorSpan(color), start,
                        end, flags);
            }
        }
        return spannableString;
    }


    public static SpannableString setImageSpan(Context context,
                                               SpannableString spannableString, int resId, Pattern... patterns) {
        Drawable emoji = context.getResources().getDrawable(resId);
        int w = (int) (emoji.getIntrinsicWidth());
        int h = (int) (emoji.getIntrinsicHeight());
        return setImageSpan(context, spannableString, resId, w, h, patterns);
    }

    public static SpannableString setImageSpan(Context context,
                                               SpannableString spannableString, int resId, int w, int h, Pattern... patterns) {
        for (Pattern pattern : patterns) {
            List<HashMap<String, String>> list = getStartAndEnd(pattern,
                    spannableString);
            for (HashMap<String, String> hashMap : list) {
                int start = Integer.parseInt(hashMap.get(START));
                int end = Integer.parseInt(hashMap.get(END));
                int flags = Spannable.SPAN_EXCLUSIVE_EXCLUSIVE;
                Drawable emoji = context.getResources().getDrawable(resId);
                emoji.setBounds(0, 0, w, h);
                spannableString.setSpan(new ImageSpan(emoji), start,
                        end, flags);
            }
        }
        return spannableString;
    }

    public static SpannableString setClickSpan(
            SpannableString spannableString, final SpanOnClickListener listener, Pattern... patterns) {
        for (Pattern pattern : patterns) {
            List<HashMap<String, String>> list = getStartAndEnd(pattern,
                    spannableString);
            for (int i = 0; i < list.size(); i++) {
                final int index = i;
                final HashMap<String, String> hashMap = list.get(i);
                int start = Integer.parseInt(hashMap.get(START));
                int end = Integer.parseInt(hashMap.get(END));
                int flags = Spannable.SPAN_EXCLUSIVE_EXCLUSIVE;
                spannableString.setSpan(new ClickableSpan() {
                                            @Override
                                            public void onClick(View widget) {
                                                String regex = hashMap.get(REGEX);
                                                if (listener != null) {
                                                    listener.onClick(widget, regex, index);
                                                }
                                            }

                                            @Override
                                            public void updateDrawState(TextPaint ds) {
                                                if (listener != null) {
                                                    listener.setClickDrawState(ds);
                                                }
                                                //  super.updateDrawState(ds);
                                            }
                                        }, start,
                        end, flags);
            }
        }
        return spannableString;
    }
    
    public interface SpanOnClickListener {
        
        void onClick(View v, String regex, int index);

        void setClickDrawState(TextPaint ds);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值