import android.animation.Animator;
import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;
import android.util.Log;
import java.util.ArrayList;
/**
* 防止无限循环动画,导致内存泄漏控件
*
* 出现内存泄漏原因:当无限循环启动动画,控件销毁后,动画还一直启动,导致内存泄漏
* 用途:对话框使用无限循环时候,RecyclerView item使用无限动画时,activity使用无限动画时
*/
public class AnimationImageView extends AppCompatImageView {
private Animator animator;
//动画结束后,多少毫秒再启动
private int startAfterEnd;
public AnimationImageView(Context context) {
super(context);
}
public AnimationImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
// 启动普通动画
public void startAnimator(Animator animator) {
startLoopAnimator(animator,null);
}
//启动循环动画
public void startLoopAnimator(Animator animator){
startLoopAnimator(animator,new LoopListener());
}
public Animator getAnimator() {
return animator;
}
public void setStartAfterEnd(int startAfterEnd) {
this.startAfterEnd = startAfterEnd;
}
public void startLoopAnimator(Animator animator, int dur){
animator.setDuration(dur);
startLoopAnimator(animator,new LoopListener());
}
public void startLoopAnimator(Animator animator, LoopListener listener){
if (this.animator == null && animator != null){
this.animator = animator;
if (listener != null){
animator.addListener(listener);
}
animator.start();
}
}
public void stopAnimtor(){
if (this.animator!= null){
this.animator.cancel();
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (animator!= null && isShown() == false){
animator.cancel();
animator.removeAllListeners();
animator = null;
}
}
//循环事件
class LoopListener implements Animator.AnimatorListener {
private boolean isCancel;
private String TAG = "LoopListener";
@Override
public void onAnimationStart(Animator animation) {
Log.d(TAG, "onAnimationStart: ");
}
@Override
public void onAnimationEnd(final Animator animation) {
Log.d(TAG, "onAnimationEnd: ");
if (isCancel == false) {
postDelayed(new Runnable() {
@Override
public void run() {
animation.start();
}
},startAfterEnd);
}
}
@Override
public void onAnimationCancel(Animator animation) {
isCancel = true;
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}
}
android 无限循环动画,导致内存泄漏
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...