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