Android加载动画系列—— CircularSmileLoadingAnim

来源:互联网 发布:cisco 配置多个端口 编辑:程序博客网 时间:2024/06/06 04:11
Android加载动画系列—— CircularSmileLoadingAnim

       一次记录一次分享,CircularSmileLoadingAnim微笑面对一切烦恼,即使生活再忙再累,也不要忘了给自己一个大大的微笑。

       让我们先来看看效果图:


1、CircularSmileLoadingAnim.java源码如下:
       public class CircularSmileLoadingAnim extends View {    private Paint mPaint;    private float mWidth = 0f;    private float mEyeWidth = 0f;    private float mPadding = 0f;    private float startAngle = 0f;    private boolean isSmile = false;    RectF rectF = new RectF();    public CircularSmileLoadingAnim(Context context) {        this(context, null);    }    public CircularSmileLoadingAnim(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public CircularSmileLoadingAnim(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initPaint();    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        if (getMeasuredWidth() > getHeight())            mWidth = getMeasuredHeight();        else            mWidth = getMeasuredWidth();        mPadding = dip2px(10);        mEyeWidth = dip2px(3);    }    private int dip2px(float dpValue) {        final float scale = getContext().getResources().getDisplayMetrics().density;        return (int) (dpValue * scale + 0.5f);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        rectF = new RectF(mPadding, mPadding, mWidth - mPadding, mWidth - mPadding);        mPaint.setStyle(Paint.Style.STROKE);        canvas.drawArc(rectF, startAngle, 180, false, mPaint);        mPaint.setStyle(Paint.Style.FILL);        if (isSmile) {            canvas.drawCircle(mPadding + mEyeWidth + mEyeWidth / 2, mWidth / 3, mEyeWidth, mPaint);            canvas.drawCircle(mWidth - mPadding - mEyeWidth / 2, mWidth / 3, mEyeWidth, mPaint);        }    }    private void initPaint() {        mPaint = new Paint();        mPaint.setAntiAlias(true);        mPaint.setStyle(Paint.Style.STROKE);        mPaint.setColor(Color.WHITE);        mPaint.setStrokeWidth(dip2px(2));    }    public void startAnim() {        stopAnim();        startViewAnim(0f, 1f, 1500);    }    ValueAnimator valueAnimator;    float mAnimatedValue = 0f;    public void stopAnim() {        if (valueAnimator != null) {            clearAnimation();            isSmile = false;            mAnimatedValue = 0f;            startAngle = 0f;            valueAnimator.setRepeatCount(0);            valueAnimator.cancel();            valueAnimator.end();        }    }    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 animation) {                mAnimatedValue = (float) valueAnimator.getAnimatedValue();                if (mAnimatedValue < 0.5) {                    isSmile = false;                    startAngle = 720 * mAnimatedValue;                } else {                    startAngle = 720;                    isSmile = true;                }                invalidate();            }        });        valueAnimator.addListener(new AnimatorListenerAdapter() {            @Override            public void onAnimationEnd(Animator animation) {                super.onAnimationEnd(animation);            }            @Override            public void onAnimationRepeat(Animator animation) {                super.onAnimationRepeat(animation);            }            @Override            public void onAnimationStart(Animator animation) {                super.onAnimationStart(animation);            }        });        if (!valueAnimator.isRunning()) {            valueAnimator.start();        }        return valueAnimator;    }}
 
 

 

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

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

 

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

circularSmileLoadingAnim = (CircularSmileLoadingAnim) findViewById(R.id.circularsmile);circularSmileLoadingAnim.startAnim();
 

4、  最后小编双手奉上源码的下载地址:http://download.csdn.net/detail/zhimingshangyan/9582830

 

1 0
原创粉丝点击