11
11
import android .graphics .PorterDuffXfermode ;
12
12
import android .graphics .RectF ;
13
13
import android .graphics .drawable .Drawable ;
14
+ import android .os .Build ;
14
15
import android .support .annotation .FloatRange ;
15
16
import android .support .annotation .IntRange ;
16
17
import android .support .annotation .NonNull ;
@@ -178,6 +179,16 @@ private AvatarDrawable findAvatarDrawableById(int id) {
178
179
return null ;
179
180
}
180
181
182
+ private boolean hasSameDrawable (Drawable drawable ) {
183
+ for (AvatarDrawable d : mDrawables ) {
184
+ if (d .mDrawable == drawable ) {
185
+ return true ;
186
+ }
187
+ }
188
+
189
+ return false ;
190
+ }
191
+
181
192
/**
182
193
* 添加drawable.
183
194
*
@@ -199,10 +210,11 @@ public boolean addDrawable(@NonNull Drawable drawable) {
199
210
public boolean addDrawable (int id , @ NonNull Drawable drawable ) {
200
211
AvatarDrawable old = findAvatarDrawableById (id );
201
212
if (old != null ) {
202
- old .mDrawable .setCallback (null );
203
- unscheduleDrawable (old .mDrawable );
204
-
213
+ Drawable d = old .mDrawable ;
205
214
old .mDrawable = drawable ;
215
+ if (!hasSameDrawable (d )) {
216
+ cleanDrawable (d );
217
+ }
206
218
} else {
207
219
if (getNumberOfDrawables () >= MAX_DRAWABLE_COUNT ) {
208
220
return false ;
@@ -213,9 +225,13 @@ public boolean addDrawable(int id, @NonNull Drawable drawable) {
213
225
}
214
226
215
227
drawable .setCallback (this );
228
+ drawable .setVisible (getVisibility () == VISIBLE , true );
216
229
if (drawable .isStateful ()) {
217
230
drawable .setState (getDrawableState ());
218
231
}
232
+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
233
+ drawable .setLayoutDirection (getLayoutDirection ());
234
+ }
219
235
220
236
return true ;
221
237
}
@@ -277,8 +293,9 @@ public Drawable removeDrawableById(int id) {
277
293
@ NonNull
278
294
public Drawable removeDrawableAt (int index ) {
279
295
AvatarDrawable drawable = mDrawables .remove (index );
280
- drawable .mDrawable .setCallback (null );
281
- unscheduleDrawable (drawable .mDrawable );
296
+ if (!hasSameDrawable (drawable .mDrawable )) {
297
+ cleanDrawable (drawable .mDrawable );
298
+ }
282
299
layoutDrawables ();
283
300
return drawable .mDrawable ;
284
301
}
@@ -289,14 +306,18 @@ public Drawable removeDrawableAt(int index) {
289
306
public void clearDrawable () {
290
307
if (!mDrawables .isEmpty ()) {
291
308
for (AvatarDrawable drawable : mDrawables ) {
292
- drawable .mDrawable .setCallback (null );
293
- unscheduleDrawable (drawable .mDrawable );
309
+ cleanDrawable (drawable .mDrawable );
294
310
}
295
311
mDrawables .clear ();
296
312
layoutDrawables ();
297
313
}
298
314
}
299
315
316
+ private void cleanDrawable (Drawable drawable ) {
317
+ drawable .setCallback (null );
318
+ unscheduleDrawable (drawable );
319
+ }
320
+
300
321
private void layoutDrawables () {
301
322
mSteinerCircleRadius = 0 ;
302
323
mOffsetY = 0 ;
@@ -437,6 +458,30 @@ protected void onDraw(Canvas canvas) {
437
458
}
438
459
}
439
460
461
+ @ Override
462
+ public void setVisibility (int visibility ) {
463
+ super .setVisibility (visibility );
464
+ for (AvatarDrawable drawable : mDrawables ) {
465
+ drawable .mDrawable .setVisible (visibility == VISIBLE , false );
466
+ }
467
+ }
468
+
469
+ @ Override
470
+ protected void onAttachedToWindow () {
471
+ super .onAttachedToWindow ();
472
+ for (AvatarDrawable drawable : mDrawables ) {
473
+ drawable .mDrawable .setVisible (getVisibility () == VISIBLE , false );
474
+ }
475
+ }
476
+
477
+ @ Override
478
+ protected void onDetachedFromWindow () {
479
+ super .onDetachedFromWindow ();
480
+ for (AvatarDrawable drawable : mDrawables ) {
481
+ drawable .mDrawable .setVisible (false , false );
482
+ }
483
+ }
484
+
440
485
@ Override
441
486
protected void drawableStateChanged () {
442
487
super .drawableStateChanged ();
@@ -473,6 +518,11 @@ public void invalidateDrawable(@NonNull Drawable drawable) {
473
518
super .invalidateDrawable (drawable );
474
519
}
475
520
521
+ @ Override
522
+ public CharSequence getAccessibilityClassName () {
523
+ return CompositionAvatarView .class .getName ();
524
+ }
525
+
476
526
private static class AvatarDrawable {
477
527
int mId = View .NO_ID ;
478
528
Drawable mDrawable ;
0 commit comments