欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Textview 部分文字改变大小, 下划线, 颜色与点击事件

程序员文章站 2023-12-24 19:04:15
...

参考 :
1. https://blog.csdn.net/lowprofile_coding/article/details/48138073
2. https://blog.csdn.net/singwhatiwanna/article/details/18363899

需要注意的是, 使用这个方式后, 设置特殊效果的文字会拦截点击事件, 如果是父布局统一带了点击事件时, 会导致点击 TextView 不会响应父布局事件. 必须再单独为这个TextView再设置一次点击事件. 并且注意顺序, 先设置文字效果, 再设置点击事件.

public class TextViewUtils {

    /**
     * 设置部分文字加下划线, 特殊颜色, 及点击效果
     * @param tv        传入的TextView
     * @param strId     传入 TextView 需要展示的文字在string.xml中的id
     * @param underLine 是否显示下划线
     * @param color     部分特殊文字的颜色 传入-1 默认为蓝色
     * @param start     特殊文字从哪个位置开始 传入 -1 则从文字最开始设置
     * @param end       特殊文字从哪个位置结束 传入 -1 则默认设置到文字最后
     * @param textSize  文字大小sp  传入 > 0 的 sp 值
     * @param listener  传入自定义点击监听器 不需要时传 null 即可
     */
    public static void setSpan(TextView tv,
                        @StringRes int strId,
                        final boolean underLine,
                        @ColorRes final int color,
                        int start,
                        int end,
                        int textSize,
                        final View.OnClickListener listener){

        final Context context = MyApplication.getContext();
        tv.setHighlightColor(ContextCompat.getColor(context, android.R.color.transparent));
        String str = context.getString(strId);
        SpannableString info = new SpannableString(str);

        int startNum = (start <= -1) ? 0 : start;
        int endNum = (end <= -1) ? str.length() : end;

        if (textSize > 0){
            info.setSpan(new AbsoluteSizeSpan(sp2px(context, textSize)), startNum,
                    endNum, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }

        info.setSpan(new ClickableSpan() {

                         /**
                          * 重写父类点击事件
                          */
                         @Override
                         public void onClick(View widget) {
                             if (listener != null) {
                                 listener.onClick(widget);
                             }
                         }

                         /**
                          * 重写父类updateDrawState方法  我们可以给TextView设置字体颜色,背景颜色等等...
                          */
                         @Override
                         public void updateDrawState(TextPaint ds) {
                             int colorRes = color;
                             if(color == -1) colorRes = Color.BLUE;
                             ds.setColor(ContextCompat.getColor(context, colorRes));
                             ds.setUnderlineText(underLine);
                         }
                     }, startNum,
                endNum, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv.setText(info);
        tv.setMovementMethod(LinkMovementMethod.getInstance());
    }

    private static int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }
}

上一篇:

下一篇: