25
25
import android .text .style .StyleSpan ;
26
26
import android .text .style .UnderlineSpan ;
27
27
import android .util .AttributeSet ;
28
- import android .util .Log ;
29
28
import android .view .View ;
30
29
import android .view .ViewGroup ;
31
30
@@ -73,6 +72,11 @@ public class TextViewReadMore extends AppCompatTextView {
73
72
private int actionClickColor = 0 ;
74
73
private int ellipsisType = ELLIPSIS_TYPE_DOTS ;
75
74
75
+ private int totalMarginSide = 0 ;
76
+
77
+ private SpannableStringBuilder spanCollapsed ;
78
+ private SpannableStringBuilder spanExpanded ;
79
+
76
80
private static long mLastClickTime = 0 ;
77
81
78
82
public TextViewReadMore (@ NonNull Context context ) {
@@ -122,6 +126,10 @@ private void init(Context context, AttributeSet attrs, int defStyleAttr) {
122
126
123
127
ellipsisType = typedArray .getInt (R .styleable .TextViewReadMore_ellipsisType , ELLIPSIS_TYPE_DOTS );
124
128
129
+ int marginStart = typedArray .getDimensionPixelSize (R .styleable .TextViewReadMore_android_layout_marginStart , 0 );
130
+ int marginEnd = typedArray .getDimensionPixelSize (R .styleable .TextViewReadMore_android_layout_marginEnd , 0 );
131
+ totalMarginSide = marginStart + marginEnd ;
132
+
125
133
} finally {
126
134
typedArray .recycle ();
127
135
}
@@ -154,13 +162,24 @@ public void setText(CharSequence text, BufferType type) {
154
162
rebuild = true ;
155
163
}
156
164
}
157
- super .setText (text , type );
165
+ if (isEllipsized (text )) {
166
+ if (spanExpanded != null && !collapsed ) {
167
+ super .setText (spanExpanded , type );
168
+ } else if (spanCollapsed != null && collapsed ) {
169
+ super .setText (spanCollapsed , type );
170
+ } else {
171
+ super .setText (text , type );
172
+ }
173
+ } else {
174
+ super .setText (text , type );
175
+ }
158
176
}
159
177
160
178
@ Override
161
179
protected void onMeasure (int widthMeasureSpec , int heightMeasureSpec ) {
162
180
int givenWidth = MeasureSpec .getSize (widthMeasureSpec );
163
- lineWidth = givenWidth - getCompoundPaddingStart () - getCompoundPaddingEnd ();
181
+ int sidePadding = getCompoundPaddingStart () + getCompoundPaddingEnd ();
182
+ lineWidth = givenWidth - sidePadding - totalMarginSide ;
164
183
super .onMeasure (widthMeasureSpec , heightMeasureSpec );
165
184
}
166
185
@@ -172,7 +191,6 @@ protected void onDraw(Canvas canvas) {
172
191
}
173
192
174
193
private void buildSpan () {
175
- debug ("mHeight(" +getHeight ()+") " +text );
176
194
if (!TextUtils .isEmpty (text )) {
177
195
isEllipsized = isEllipsized (text );
178
196
if (isEllipsized ) {
@@ -212,30 +230,39 @@ private void buildSpan() {
212
230
finalText = truncatedText .toString ().replace (DOTS_CODE , "" );
213
231
String collapsedText = finalText + SPACE_CODE + exp ;
214
232
StaticLayout layout = getStaticLayoutCollapsed (collapsedText );
215
- SpannableStringBuilder spanCollapsed = spanCollapsed (collapsedText );
233
+ spanCollapsed = spanCollapsed (collapsedText );
216
234
if (spanCollapsed != null ) {
217
235
updateParam (layout .getHeight ());
218
236
setText (spanCollapsed );
219
237
}
238
+ spanExpanded = spanExpanded ();
220
239
} else {
221
- String collapsedTextSpace = collapseText .replaceAll (" " , SPACE_CODE );
222
- String fullText = text + SPACE_CODE + collapsedTextSpace ;
223
- SpannableStringBuilder spanExpanded = spanExpanded (fullText );
224
- StaticLayout layout = getStaticLayout (fullText );
225
- setText (spanExpanded );
240
+ spanExpanded = spanExpanded ();
241
+ StaticLayout layout = getStaticLayout (spanExpanded .toString ());
226
242
updateParam (layout .getHeight ());
243
+ setText (spanExpanded );
227
244
}
228
245
setMovementMethod (LinkMovementMethod .getInstance ());
229
246
rebuild = false ;
230
247
}
231
248
} else {
249
+ rebuild = false ;
232
250
StaticLayout layout = getStaticLayout (text );
233
- updateParam (layout .getHeight ());
251
+ post (() -> updateParam (layout .getHeight () ));
234
252
}
235
253
}
236
254
}
237
255
238
- private boolean isEllipsized (String text ) {
256
+ private boolean isEllipsized (@ Nullable CharSequence charSequence ) {
257
+ if (charSequence == null )
258
+ return false ;
259
+ StaticLayout layout = getStaticLayout (charSequence .toString ());
260
+ return layout .getLineCount () > maxLines ;
261
+ }
262
+
263
+ private boolean isEllipsized (@ Nullable String text ) {
264
+ if (text == null )
265
+ return false ;
239
266
StaticLayout layout = getStaticLayout (text );
240
267
return layout .getLineCount () > maxLines ;
241
268
}
@@ -287,6 +314,13 @@ public void updateDrawState(@NonNull TextPaint ds) {
287
314
return span ;
288
315
}
289
316
317
+ private SpannableStringBuilder spanExpanded () {
318
+ String collapsedTextSpace = collapseText .replaceAll (" " , SPACE_CODE );
319
+ String fullText = text + SPACE_CODE + collapsedTextSpace ;
320
+ spanExpanded = spanExpanded (fullText );
321
+ return spanExpanded ;
322
+ }
323
+
290
324
private SpannableStringBuilder spanExpanded (String text ) {
291
325
SpannableStringBuilder span = new SpannableStringBuilder (text );
292
326
int start = text .length () - collapseText .length ();
@@ -311,7 +345,7 @@ private SpannableStringBuilder spanExpanded(String text) {
311
345
public void onClick (@ NonNull View widget ) {
312
346
if (onClickCollapse != null ) {
313
347
new Handler (Looper .getMainLooper ()).postDelayed (
314
- () -> onClickCollapse .onClick (widget ), 150
348
+ () -> onClickCollapse .onClick (widget ), 100
315
349
);
316
350
}
317
351
}
@@ -364,7 +398,9 @@ public void onAnimationStart(Animator animation) {
364
398
super .onAnimationStart (animation );
365
399
isAnimate = true ;
366
400
if (collapsed ) {
367
- setText (text , BufferType .SPANNABLE );
401
+ collapsed = false ;
402
+ setText (spanExpanded );
403
+ collapsed = true ;
368
404
}
369
405
}
370
406
@ Override
@@ -374,7 +410,8 @@ public void onAnimationEnd(Animator animation) {
374
410
collapsed = !collapsed ;
375
411
rebuild = true ;
376
412
new Handler (Looper .getMainLooper ()).postDelayed (() -> {
377
- if (toggleListener != null ) toggleListener .onToggle (collapsed );
413
+ if (toggleListener != null )
414
+ toggleListener .onToggle (collapsed );
378
415
}, 0 );
379
416
}
380
417
});
@@ -421,10 +458,11 @@ private String ellipsize(String text, int size) {
421
458
}
422
459
423
460
461
+ /* Unused function
424
462
private void debug(String message) {
425
463
Log.d("TextViewReadMore", message);
426
464
}
427
- /* Unused function
465
+
428
466
private String textReplaceSpace() {
429
467
return text.replaceAll(" ", SPACE_CODE);
430
468
}
0 commit comments