Android属性动画自定义弹跳加载效果

2018-11-28  本文已影响81人  dlihasa
效果(忽略具体用图)
弹跳加载.gif
自定义view代码
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.animation.AccelerateDecelerateInterpolator;

import com.dhasa.selfview.R;

public class LoadingImageView extends android.support.v7.widget.AppCompatImageView{

    private int mTop;

    public LoadingImageView(Context context) {
        super(context);
        init();
    }

    public LoadingImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public LoadingImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        ValueAnimator animator = ValueAnimator.ofInt(0,100,0);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int dx = (int) animation.getAnimatedValue();
                setTop(mTop-dx);
            }
        });
        animator.addListener(new Animator.AnimatorListener() {

            private int curImgIndex = 0;
            private int imgCount = 3;

            @Override
            public void onAnimationStart(Animator animation) {
                setImageResource(R.drawable.icon_mobile);
            }

            @Override
            public void onAnimationEnd(Animator animation) {

            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {
                curImgIndex++;
                switch (curImgIndex%imgCount){
                    case 0:
                        setImageResource(R.drawable.icon_mobile);
                        break;
                    case 1:
                        setImageResource(R.drawable.loading);
                        break;
                    case 2:
                        setImageResource(R.drawable.scan_circle);
                        break;
                }
            }
        });
        animator.setRepeatMode(ValueAnimator.RESTART);
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.setInterpolator(new AccelerateDecelerateInterpolator());
        animator.setDuration(2000);
        animator.start();

    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        mTop = top;
    }
}
代码思路:
上一篇下一篇

猜你喜欢

热点阅读