Android加载动画系列——WifiLoadingAnim

来源:互联网 发布:关键词优化在哪里 编辑:程序博客网 时间:2024/05/18 18:42
Android加载动画系列——WifiLoadingAnim

       我们经常会遇到这样一种场景,加载网页的时候,刚好遇到网速不给力,然后就加载失败了,这个时候为了用户友好性原则,我们会给出一个加载失败的页面,有些设计会放置一张wifi的图片,如果把图片换成动画会不会更好呢?让我们来看看wifi加载动画怎么实现吧~

       让我们先来看看效果图:


1、WifiLoadingAnim.java源码如下:
public class WifiLoadingAnim extends View {    private float mWidth = 0f;    private Paint mPaint;    private int signalSize = 4;    public WifiLoadingAnim(Context context) {        this(context, null);    }    public WifiLoadingAnim(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public WifiLoadingAnim(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initPaint();    }    private void initPaint() {        mPaint = new Paint();        mPaint.setAntiAlias(true);        mPaint.setStyle(Paint.Style.STROKE);        mPaint.setColor(Color.WHITE);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.save();        canvas.translate(0, mWidth / signalSize);        mPaint.setStrokeWidth(mWidth / signalSize / 2 / 2 / 2);        int scale = (int) ((mAnimatedValue * signalSize - (int) (mAnimatedValue * signalSize)) * signalSize) + 1;        RectF rect = null;        float signalRadius = mWidth / 2 / signalSize;        for (int i = 0; i < signalSize; i++) {            if (i >= signalSize - scale) {                float radius = signalRadius * i;                rect = new RectF(                        radius,                        radius,                        mWidth - radius,                        mWidth - radius);                if (i < signalSize - 1) {                    mPaint.setStyle(Paint.Style.STROKE);                    canvas.drawArc(rect, -135, 90                            , false, mPaint);                } else {                    mPaint.setStyle(Paint.Style.FILL);                    canvas.drawArc(rect, -135, 90                            , true, mPaint);                }            }        }        canvas.restore();    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        if (getMeasuredWidth() > getHeight())            mWidth = getMeasuredHeight();        else            mWidth = getMeasuredWidth();    }    public void startAnim() {        stopAnim();        startViewAnim(0f, 1f, 6000);    }    private ValueAnimator valueAnimator;    private float mAnimatedValue = 0.9f;    public void stopAnim() {        if (valueAnimator != null) {            clearAnimation();            valueAnimator.setRepeatCount(0);            valueAnimator.cancel();            valueAnimator.end();            mAnimatedValue = 0.9f;            postInvalidate();        }    }    private ValueAnimator startViewAnim(float startF, final float endF, long time) {        valueAnimator = ValueAnimator.ofFloat(startF, endF);        valueAnimator.setDuration(time);        valueAnimator.setInterpolator(new LinearInterpolator());        valueAnimator.setRepeatCount(ValueAnimator.INFINITE);//无限循环        valueAnimator.setRepeatMode(ValueAnimator.RESTART);        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator valueAnimator) {                mAnimatedValue = (float) valueAnimator.getAnimatedValue();                invalidate();            }        });        valueAnimator.addListener(new AnimatorListenerAdapter() {            @Override            public void onAnimationEnd(Animator animation) {                super.onAnimationEnd(animation);            }            @Override            public void onAnimationStart(Animator animation) {                super.onAnimationStart(animation);            }            @Override            public void onAnimationRepeat(Animator animation) {                super.onAnimationRepeat(animation);            }        });        if (!valueAnimator.isRunning()) {            valueAnimator.start();        }        return valueAnimator;    }    public int dip2px(float dpValue) {        final float scale = getContext().getResources().getDisplayMetrics().density;        return (int) (dpValue * scale + 0.5f);    }}
 

2、接下来我们在layout中引用自定义的动画控件,如下所示:

<com.cyril.loadinganim.WifiLoadingAnim    android:id="@+id/wifianim"    android:layout_width="50dp"    android:layout_height="50dp"     />

 

3、然后在Activity中实现动画的播放和停止,使用事例如下:

wifiLoadingAnim = (WifiLoadingAnim) findViewById(R.id.wifianim);wifiLoadingAnim.startAnim();
 

4、  戳这里,小编带你去源码的下载地址:http://download.csdn.net/detail/zhimingshangyan/9582830

 

0 0
原创粉丝点击