android 简单的旋转动画

需求做完了,没事想想感觉自己对动画这方面知识太弱了,于是准备花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();
        }
    }
}
效果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值