Skip to content

Commit e39e277

Browse files
committed
AnimationDrawable优化
1 parent a90739c commit e39e277

File tree

1 file changed

+57
-7
lines changed

1 file changed

+57
-7
lines changed

composition-avatar/src/main/java/cn/yiiguxing/compositionavatar/CompositionAvatarView.java

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import android.graphics.PorterDuffXfermode;
1212
import android.graphics.RectF;
1313
import android.graphics.drawable.Drawable;
14+
import android.os.Build;
1415
import android.support.annotation.FloatRange;
1516
import android.support.annotation.IntRange;
1617
import android.support.annotation.NonNull;
@@ -178,6 +179,16 @@ private AvatarDrawable findAvatarDrawableById(int id) {
178179
return null;
179180
}
180181

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+
181192
/**
182193
* 添加drawable.
183194
*
@@ -199,10 +210,11 @@ public boolean addDrawable(@NonNull Drawable drawable) {
199210
public boolean addDrawable(int id, @NonNull Drawable drawable) {
200211
AvatarDrawable old = findAvatarDrawableById(id);
201212
if (old != null) {
202-
old.mDrawable.setCallback(null);
203-
unscheduleDrawable(old.mDrawable);
204-
213+
Drawable d = old.mDrawable;
205214
old.mDrawable = drawable;
215+
if (!hasSameDrawable(d)) {
216+
cleanDrawable(d);
217+
}
206218
} else {
207219
if (getNumberOfDrawables() >= MAX_DRAWABLE_COUNT) {
208220
return false;
@@ -213,9 +225,13 @@ public boolean addDrawable(int id, @NonNull Drawable drawable) {
213225
}
214226

215227
drawable.setCallback(this);
228+
drawable.setVisible(getVisibility() == VISIBLE, true);
216229
if (drawable.isStateful()) {
217230
drawable.setState(getDrawableState());
218231
}
232+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
233+
drawable.setLayoutDirection(getLayoutDirection());
234+
}
219235

220236
return true;
221237
}
@@ -277,8 +293,9 @@ public Drawable removeDrawableById(int id) {
277293
@NonNull
278294
public Drawable removeDrawableAt(int index) {
279295
AvatarDrawable drawable = mDrawables.remove(index);
280-
drawable.mDrawable.setCallback(null);
281-
unscheduleDrawable(drawable.mDrawable);
296+
if (!hasSameDrawable(drawable.mDrawable)) {
297+
cleanDrawable(drawable.mDrawable);
298+
}
282299
layoutDrawables();
283300
return drawable.mDrawable;
284301
}
@@ -289,14 +306,18 @@ public Drawable removeDrawableAt(int index) {
289306
public void clearDrawable() {
290307
if (!mDrawables.isEmpty()) {
291308
for (AvatarDrawable drawable : mDrawables) {
292-
drawable.mDrawable.setCallback(null);
293-
unscheduleDrawable(drawable.mDrawable);
309+
cleanDrawable(drawable.mDrawable);
294310
}
295311
mDrawables.clear();
296312
layoutDrawables();
297313
}
298314
}
299315

316+
private void cleanDrawable(Drawable drawable) {
317+
drawable.setCallback(null);
318+
unscheduleDrawable(drawable);
319+
}
320+
300321
private void layoutDrawables() {
301322
mSteinerCircleRadius = 0;
302323
mOffsetY = 0;
@@ -437,6 +458,30 @@ protected void onDraw(Canvas canvas) {
437458
}
438459
}
439460

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+
440485
@Override
441486
protected void drawableStateChanged() {
442487
super.drawableStateChanged();
@@ -473,6 +518,11 @@ public void invalidateDrawable(@NonNull Drawable drawable) {
473518
super.invalidateDrawable(drawable);
474519
}
475520

521+
@Override
522+
public CharSequence getAccessibilityClassName() {
523+
return CompositionAvatarView.class.getName();
524+
}
525+
476526
private static class AvatarDrawable {
477527
int mId = View.NO_ID;
478528
Drawable mDrawable;

0 commit comments

Comments
 (0)