mac
2024-05-17 d46bfdd7ea07d9630e1f0f686d77775342550025
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
package com.hdl.photovoltaic.utils;
 
import android.graphics.Paint;
import android.graphics.Typeface;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.style.BackgroundColorSpan;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.MetricAffectingSpan;
import android.text.style.RelativeSizeSpan;
import android.view.View;
 
import androidx.annotation.NonNull;
 
 
/**
 * String字符串通过区间来改变颜色,大小,字体,下划线等
 */
public class SpanUtils {
 
    private long mLastClickTime = 0;
    public static final int TIME_INTERVAL = 1000;
 
 
    private static volatile SpanUtils sSpanUtils;
 
 
    /**
     * 获取当前对象
     *
     * @return HdlCommonLogic
     */
    public static synchronized SpanUtils getInstance() {
        if (sSpanUtils == null) {
            synchronized (SpanUtils.class) {
                if (sSpanUtils == null) {
                    sSpanUtils = new SpanUtils();
                }
            }
 
        }
        return sSpanUtils;
    }
 
    private SpanUtils() {
    }
 
    /**
     * 变大变小
     */
    public CharSequence toSizeSpan(CharSequence charSequence, int start, int end, float scale) {
 
        SpannableString spannableString = new SpannableString(charSequence);
 
        spannableString.setSpan(
                new RelativeSizeSpan(scale),
                start,
                end,
                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
 
        return spannableString;
    }
 
    /**
     * 变色
     */
    public CharSequence toColorSpan(CharSequence charSequence, int start, int end, int color) {
 
        SpannableString spannableString = new SpannableString(charSequence);
 
        spannableString.setSpan(
                new ForegroundColorSpan(color),
                start,
                end,
                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
 
        return spannableString;
    }
 
    /**
     * 变背景色
     */
    public CharSequence toBackgroundColorSpan(CharSequence charSequence, int start, int end, int color) {
 
        SpannableString spannableString = new SpannableString(charSequence);
 
        spannableString.setSpan(
                new BackgroundColorSpan(color),
                start,
                end,
                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
 
        return spannableString;
    }
 
 
    /**
     * 可点击-带下划线
     */
    public CharSequence toClickSpan(CharSequence charSequence, int start, int end, int color, boolean needUnderLine, OnSpanClickListener listener) {
 
        SpannableString spannableString = new SpannableString(charSequence);
 
        ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void onClick(@NonNull View widget) {
                if (listener != null) {
                    //防止重复点击
                    if (System.currentTimeMillis() - mLastClickTime >= TIME_INTERVAL) {
                        //to do
                        listener.onClick(charSequence.subSequence(start, end));
 
                        mLastClickTime = System.currentTimeMillis();
                    }
 
                }
            }
 
            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                ds.setColor(color);
                ds.setUnderlineText(needUnderLine);
            }
        };
 
        spannableString.setSpan(
                clickableSpan,
                start,
                end,
                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
 
        return spannableString;
    }
 
    public interface OnSpanClickListener {
        void onClick(CharSequence charSequence);
    }
 
 
    /**
     * 变成自定义的字体
     */
    public CharSequence toCustomTypeFaceSpan(CharSequence charSequence, int start, int end, Typeface typeface) {
 
        SpannableString spannableString = new SpannableString(charSequence);
 
        spannableString.setSpan(
                new MyTypefaceSpan(typeface),
                start,
                end,
                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
 
        return spannableString;
    }
 
    /**
     * 系统原生的TypefaceSpan只能使用原生的默认字体
     * 如果使用自定义的字体,通过这个来实现
     */
    public class MyTypefaceSpan extends MetricAffectingSpan {
        private final Typeface typeface;
 
        public MyTypefaceSpan(final Typeface typeface) {
            this.typeface = typeface;
        }
 
        @Override
        public void updateDrawState(final TextPaint drawState) {
            apply(drawState);
        }
 
        @Override
        public void updateMeasureState(final TextPaint paint) {
            apply(paint);
        }
 
        private void apply(final Paint paint) {
            final Typeface oldTypeface = paint.getTypeface();
            final int oldStyle = oldTypeface != null ? oldTypeface.getStyle() : 0;
            int fakeStyle = oldStyle & ~typeface.getStyle();
            if ((fakeStyle & Typeface.BOLD) != 0) {
                paint.setFakeBoldText(true);
            }
            if ((fakeStyle & Typeface.ITALIC) != 0) {
                paint.setTextSkewX(-0.25f);
            }
            paint.setTypeface(typeface);
        }
    }
}