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;
}
}
代码思路:
- 为了容易更换图片,直接继承自ImageView
- 属性动画可以添加两种监听事件,ValueAnimator.AnimatorUpdateListener用来监听移动距离变化来改变控件位置,Animator.AnimatorListener用来修改图片显示。