需求做完了,没事想想感觉自己对动画这方面知识太弱了,于是准备花2个月时间在动画这块,希望能有所提高,刚开始从简单的动画自己做做,然后github找些难点的自己研究,这篇博客讲的动画是很简单的,在项目需求上肯定用不上,只是自己玩玩而已,贴代码
package com.load.anim; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.View; import android.view.animation.Animation; import android.view.animation.LinearInterpolator; import android.view.animation.RotateAnimation; import java.util.Random; /** * Created by lumingmin on 16/6/20. */ public class LoadingView extends View { private static final String TAG ="LoadingView" ; private Paint mPaint;//画笔 private float mWidth = 0f;//view的宽度 private float mPadding = 0f;//防止绘制圆时 被切掉 private int radius = 40; RotateAnimation rotateAnimation; //这些值来自系统源码copy过来的 public static final int BLACK = -16777216; public static final int BLUE = -16776961; public static final int CYAN = -16711681; public static final int DKGRAY = -12303292; public static final int GRAY = -7829368; public static final int GREEN = -16711936; public static final int LTGRAY = -3355444; public static final int MAGENTA = -65281; public static final int RED = -65536; public static final int TRANSPARENT = 0; public static final int WHITE = -1; public static final int YELLOW = -256; private int[] colors = new int[]{BLACK,BLUE,CYAN,DKGRAY,GRAY,GREEN,LTGRAY,MAGENTA,RED,TRANSPARENT,WHITE,YELLOW}; private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); invalidate(); mHandler.sendEmptyMessageDelayed(1,100); } }; public LoadingView(Context context) { this(context, null); } public LoadingView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public LoadingView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaint(); initAnim(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(240,240); mWidth = getMeasuredWidth(); mPadding = 5; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //绘制外圆 mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(3); mPaint.setColor(Color.WHITE); canvas.drawCircle(mWidth/2,mWidth/2,mWidth/2-mPadding,mPaint); //绘制里面小圆点 mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(Color.WHITE); mPaint.setStrokeWidth(2); canvas.drawCircle(mWidth/2,mWidth/2,8,mPaint); //绘制左边上角弧线 mPaint.setColor(Color.parseColor("#98FB98")); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(2); RectF rectF = new RectF(mWidth / 2 - mWidth / 3, mWidth / 2 - mWidth / 3, mWidth / 2 + mWidth / 3, mWidth / 2 + mWidth / 3); //-90表示逆时针 canvas.drawArc(rectF,0,-70,false,mPaint); mPaint.setColor(Color.parseColor("#8E388E")); canvas.drawArc(rectF,90,70,false,mPaint); mPaint.setColor(Color.parseColor("#8DB6CD")); canvas.drawArc(rectF,180,70,false,mPaint); mPaint.setColor(Color.parseColor("#525252")); canvas.drawArc(rectF,0,70,false,mPaint); int color = new Random().nextInt(colors.length); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(3); mPaint.setColor(colors[color]); radius+=5; if(radius>=200){ radius = 40; } canvas.drawCircle(mWidth/2,mWidth/2,radius,mPaint); } /** * 初始化动画 */ private void initAnim() { //以view的中心点为旋转参考点 rotateAnimation = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotateAnimation.setRepeatCount(-1); rotateAnimation.setFillAfter(true); rotateAnimation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { mHandler.sendEmptyMessage(1); } @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } }); } /** * 初始化画笔 */ private void initPaint() { mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { startAnim(); } }); } /** * 开始动画 */ public void startAnim() { stopAnim(); rotateAnimation.setDuration(200); rotateAnimation.setInterpolator(new LinearInterpolator());//不停顿 startAnimation(rotateAnimation); } /** * 停止动画 */ public void stopAnim() { clearAnimation(); } @Override protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); if(visibility==View.INVISIBLE){ stopAnim(); } } }效果: